我正在和我的团队一起开展一个java项目.总而言之,我们有一个主类,它有一个实例化并调用"Save"类的方法.这个"保存"类将文件保存回服务器,其中包含几个构造函数和一些可见和不可见的方法.该类占用大量CPU并且非常耗时,这会阻止主应用程序显示进度条对话框窗口,让用户知道保存的状态.他们要求我修改"保存"类,使其产生自己的线程,这样主应用程序的其余部分就可以完成向用户显示信息的较小任务.
以下是它的一般概念:
class MainApp{
...
private void doSave()
{
Save s = new Save();
StatusWindow sw = new StatusWindow();
if save_this
s.saveThis(sw);
if save_that
s.saveThat(sw);
...
}
...
}
class Save{
...
public void saveThis(StatusWindow s)
{
//alot of code
s.update;
}
public void saveThat(StatusWindow s)
{
//alot of code
s.update;
}
... // some non-visible methods, even more code
}
Run Code Online (Sandbox Code Playgroud)
我现在是Java中线程的新手,但我对它们的工作原理有基本的了解.根据我的理解,实现Runnable的类,当它被实例化为新线程时,执行run()方法.问题是,由于针对不同类型的文件存在不同类型的保存方法,因此如何将这些方法实现到run()方法中?run()方法是在新线程中实例化类并且在其上调用.start()时执行的唯一方法吗?
什么是这个问题的好方法?是否需要重新设计"Save"类以使其实现Runnable?
如果需要更多详细信息,请告知我们.感谢您的任何见解!
更新:感谢大家的帮助!这些解决方案将为未来派上用场.
我有一个Service,它实现了MediaPlayer.OnPreparedListener.
到目前为止,我在一个函数中调用了player.setOnPreparedListener(this)并且运行良好.现在我想从Runnable调用setOnPreparedListener(使用Handler),但是我得到错误
MediaPlayer类型中的方法setOnPreparedListener(MediaPlayer.OnPreparedListener)不适用于参数(new Runnable(){})
因此,与其这样,我需要用的东西,将指向当前的类.问题是,什么?
如果我有一个实现的类,java.lang.Runnable技术上没有什么能阻止多个线程run在同一个实例上同时调用Runnable.例:
Runnable r = new MyRunnable();
//start thread 1
new Thread(r).start();
//start thread 2
new Thread(r).start();
Run Code Online (Sandbox Code Playgroud)
如果该run方法完全是"自包含的"(即不依赖于任何私有实例成员),这不是一个真正的问题,因为线程之间没有共享变量,因此您Runnable永远不会得到"损坏的"内部状态.但我认为,在大多数情况下,你Runnable 将拥有它操纵在一些私人实例成员run,那么怎么办呢?
要使用示例,我的MyRunnable类有一个私有mode字段.主要目的是干净地停止run方法(通过设置mode为STOPPED),但它也有其他用途.
public static class MyRunnable implements Runnable
{
enum Mode { RUNNING, PAUSED, STOPPED, FASTFORWARDING, REWINDING; }
private volatile Mode mode;
@Override
public void run()
{
mode = Mode.RUNNING;
while (mode != Mode.STOPPED)
{ …Run Code Online (Sandbox Code Playgroud) 我有两个按钮"开始"和"暂停"和一个Textview.
我遇到的问题是当我按下暂停按钮然后按下开始按钮后,秒表不会从它停止的位置开始.
谢谢您的帮助
public class StopWatch extends Activity {
/** Called when the activity is first created. */
private TextView timeflg;
private Button startButton;
private Button pauseButton;
private long mStartTime = 0L;
private Handler mHandler = new Handler();
long millis = 0L;
@Override
public void onCreate(Bundle savedInstanceState) {
this.requestWindowFeature(Window.FEATURE_NO_TITLE);
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
if (mStartTime == 0L) {
mStartTime = SystemClock.uptimeMillis();
mHandler.removeCallbacks(mUpdateTimeTask);
mHandler.postDelayed(mUpdateTimeTask, 0);
}
timeflg = (TextView) findViewById(R.id.timeflag);
startButton = (Button) findViewById(R.id.start);
startButton.setOnClickListener(new View.OnClickListener() {
public void onClick(View view){
mHandler.postDelayed(mUpdateTimeTask, 0); …Run Code Online (Sandbox Code Playgroud) 我有一个实现Runnable接口的模式.
现在我想根据布尔值在我的程序中启动该类多线程或非多重(顺序).
我该怎么做呢?这是我目前的代码:
Constructor<?> constructor = processorClass.getConstructor(constructorParameterTypes);
Processor<T> process = (Processor<T>)constructor.newInstance(constructorParameters);
RunnableProcessor<T> runnableProcessor = new RunnableProcessor<>(process, object);
if (multiThreaded) {
new Thread(runnableProcessor).start();
}
else {
//what to do here?
}
Run Code Online (Sandbox Code Playgroud)
所以澄清一下:我想调用run()方法runnableProcessor,而不是创建一个线程.但是我认为run()直接调用已被弃用,因此寻找更好的解决方案.
问候.
我正在使用JavaFX进行项目.在启动过程中,我有一个提示,要求提供数据,我的网络类与这些数据建立了与服务器的连接.我的网络类异步工作,我在回调中得到响应.根据响应,我想从回调中打开一个新窗口(阶段).
执行我mainStage.setScene()按预期触发异常 - 不是从JavaFX应用程序线程调用,我必须使用Platform.runLater()但是:
Platform.runLater(new Runnable() {
@Override
public void run() {
System.out.println("run");
}
});
Run Code Online (Sandbox Code Playgroud)
它从不打印"run".为什么?该accountDataPrompt.login()函数位于我的JavaFX启动函数的末尾,正如我所说,网络连接是异步运行的.提示符是自定义JavaFX对话框(JavaFX UI Sandbox).
我正在尝试使用Maven和Eclipse编译Java项目,但我尝试了很多在Web上看到的解决方案,但它们似乎都没有用.我只想构建应用程序,创建一个可运行的jar并包含所需的库.我尝试过maven-dependency或maven-assembly但我肯定会错过一些东西,因为我每次都失败了.
这是我的pom.xml,它还可以,还是错过了什么?
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<!-- Project Description -->
<groupId>org.awax</groupId>
<artifactId>toolbox</artifactId>
<version>0.1.0</version>
<name>ToolBox</name>
<packaging>jar</packaging>
<url>http://maven.apache.org</url>
<description>Custom library containing useful code</description>
<!-- Project Properties -->
<properties>
<jdk.version>1.7</jdk.version>
<!-- Libraries Version -->
<log4j.version>1.2.17</log4j.version>
<jdom.version>2.0.5</jdom.version>
<miglayout.version>3.7.4</miglayout.version>
<jfreechart.version>1.0.19</jfreechart.version>
<bounce.version>0.18</bounce.version>
<!-- Maven Plugins Version -->
<eclipse.version>2.9</eclipse.version>
<compiler.version>3.2</compiler.version>
<jar.version>2.5</jar.version>
<assembly.version>2.4.1</assembly.version>
<dependency.version>2.5.1</dependency.version>
</properties>
<!-- Project Libraries -->
<dependencies>
<!-- LOG4J -->
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>${log4j.version}</version>
</dependency>
<!-- Jdom -->
<dependency>
<groupId>org.jdom</groupId>
<artifactId>jdom2</artifactId>
<version>${jdom.version}</version>
</dependency>
<!-- MigLayout -->
<dependency>
<groupId>com.miglayout</groupId>
<artifactId>miglayout</artifactId>
<version>${miglayout.version}</version>
</dependency>
<!-- JFreeChart …Run Code Online (Sandbox Code Playgroud) Java(Android)中是否有一种方法可以链接字符串和函数?我的目标是根据从单独方法接收的字符串运行某个函数.
即如果myString =="building"则执行buildingmethod();
我正在考虑使用像这样的HashMap:
HashMap<String,Runnable> hashDBTableUpdateRef = new HashMap<>();
hashDBTableUpdateRef.put("house",this.housemethod());
hashDBTableUpdateRef.put("shed",this.shedmethod());
hashDBTableUpdateRef.put("barn",this.barnmethod());
Run Code Online (Sandbox Code Playgroud)
然后
String myString = getCalculatedString();
for (String s : hashDBTableUpdateRef) {
hashDBTableUpdateRed.get(s).run();
}
Run Code Online (Sandbox Code Playgroud)
我无法真正使用参数创建泛型方法,例如function anyBuilding(String buildingType)由于以下操作和自定义枚举.有什么想法吗?是runnable前进的道路?
例如:
function housemethod() {
myHouseObject.runSomething();
}
function shedmethod() {
myShedObject.runSomething();
}
function barnmethod() {
myBarnObject.runSomething();
}
Run Code Online (Sandbox Code Playgroud)
谢谢,
假设以下简化示例.设B表示处理某些栅格数据的类:
import java.awt.image.BufferedImage;
public class B implements Runnable{
private boolean c;
private Runnable f;
public B (boolean c_, Runnable f_) { c = c_; f = f_;}
public BufferedImage process() {
//Some operations
BufferedImage output = null;
if (c) output = new BufferedImage(100, 100, BufferedImage.TYPE_INT_ARGB);
return output;
}
public void run() { process();}
}
Run Code Online (Sandbox Code Playgroud)
该处理()方法可以但可能不产生输出评价者.由于计算成本,该过程在单独的线程中运行.
设A表示将在其中运行过程的类.它还包含一些等待线程完成后的后处理步骤:
import java.awt.image.BufferedImage;
public class A {
public A(){}
public void compute() {
boolean c = true;
B b = new B( c, …Run Code Online (Sandbox Code Playgroud) 假设我们有以下C++程序
void hello (){
std :: cout << "HELLO"<<std::endl ;
}
int main(){
std:: thread t(hello) ;
t.join() ;
}
Run Code Online (Sandbox Code Playgroud)
如果我们不调用此代码中的join,我们的程序将崩溃,因为主线程将在线程t1完成之前终止.但是如果我们在Java中有相同的程序,即使main不等待线程,程序也能正常执行.
public class HelloWorld {
public static void main(String[] args) {
Thread t = new Thread(new Hello());
t.start();
}
}
class Hello implements Runnable {
public void run() {
System.out.println("Hello") ;
}
}
Run Code Online (Sandbox Code Playgroud)
那么为什么在Java中程序不会崩溃?即使主要完成,线程如何执行?
runnable ×10
java ×8
android ×3
c++ ×1
concurrency ×1
dependencies ×1
enumeration ×1
hashmap ×1
jar ×1
javafx ×1
maven ×1
pom.xml ×1
return ×1