Java 是否可以在一次调用中调用线程start()和join()?
我正在玩Java中的线程,我对join()方法有一个问题。 假设我有一个扩展线程的SampleClass。我在main中实例化了一些新线程,但我希望使用join()按顺序完成线程的作业 还是有其他方法可以使用。。。也许像这样:Java 是否可以在一次调用中调用线程start()和join()?,java,multithreading,join,Java,Multithreading,Join,我正在玩Java中的线程,我对join()方法有一个问题。 假设我有一个扩展线程的SampleClass。我在main中实例化了一些新线程,但我希望使用join()按顺序完成线程的作业 还是有其他方法可以使用。。。也许像这样: new SampleClass().start(); try{Thread.currentThread().join();}catch(InterruptedException e){...} 多谢各位 是否可以立即调用join() 不,它不是返回的void。你不能以这
new SampleClass().start();
try{Thread.currentThread().join();}catch(InterruptedException e){...}
多谢各位
是否可以立即调用join()
不,它不是返回的void
。你不能以这种方式将这些方法链接起来。您需要在线程上调用对象
是否可以立即调用join()
不,它不是返回的void
。你不能以这种方式将这些方法链接起来。您需要在线程
对象上调用。您可以使用您可以使用方法启动属于线程类。就像这样做:
Thread thread = new Thread(someRunnableTask);
//This fails to compile, because start returns NOTHING (void). This variable will not be filled with pointer to our thread object.
Thread ourOriginalThreadPointer = thread.start();
//Hence this variable references to nothing, no method can be called.
ourOriginalThreadPointer.join()
方法start属于线程类。就像这样做:
Thread thread = new Thread(someRunnableTask);
//This fails to compile, because start returns NOTHING (void). This variable will not be filled with pointer to our thread object.
Thread ourOriginalThreadPointer = thread.start();
//Hence this variable references to nothing, no method can be called.
ourOriginalThreadPointer.join()
实例化的线程不需要匿名。你可以这样做:
public static void main(String[] args) {
for(int i=0; i<5; i++){
SampleClass sc = new SampleClass();
sc.start();
try {
sc.join();
} catch (InterruptedException e) {
}
}
}
publicstaticvoidmain(字符串[]args){
对于(int i=0;i实例线程不需要匿名。您可以这样做:
public static void main(String[] args) {
for(int i=0; i<5; i++){
SampleClass sc = new SampleClass();
sc.start();
try {
sc.join();
} catch (InterruptedException e) {
}
}
}
publicstaticvoidmain(字符串[]args){
对于(int i=0;i点是什么?您可以通过调用run()获得相同的效果,没有开销。点是什么?您可以通过调用run()获得相同的效果,没有开销
你可以通过
SampleClass samClass = new SampleClass();
samClass.start();
samClass.join()
上面的代码将具有与您想要的相同的效果
现在的问题是按顺序运行线程
在一些情况下,您不需要线程顺序执行(但确实存在一些场景)。
好吧,如果你必须这样做。
那么你可以这样做
Thread t1 = ..
Thread t2 = ..
t1.start();
t1.join();
t2.start(); // t2 will start only when t1 dies
t2.join(); //
t3.start(); // t3 will start only when t2 dies..
但是上面的方法不好。因为对于其他线程,前一个线程
在实践中,我们应该把创建线程看作是一项昂贵的操作
并尝试重新使用
真正的问题通常是这样的,您必须执行任务T1、T2、T3、T4
按顺序但在不同的线程中,T1和T3必须在一个线程上运行,T2和T4必须在一个线程上运行
我得另找一个。
因此,这里我们可以使用两个线程,而不是4个线程。
Thread1将运行T1,Thread2将运行T2,Thread1将运行T3,依此类推
i、 e
所有任务将按顺序执行,但仅使用2个线程
你可以像下面这样解决这个问题
Thread1 ->run {
while(canIrun) {
executeTask(taskQueue1.next());
notifyThread2();
waitForThread2Signal();
}
}
Thread2 -.run {
while(canIrun) {
waitForThread1Signal();
executeTask(taskQueue2.next());
notifyThread1();
}
}
使用CyclicBarrier可以很容易地实现wait-and-notify方法
你可以通过
SampleClass samClass = new SampleClass();
samClass.start();
samClass.join()
上面的代码将具有与您想要的相同的效果
现在的问题是按顺序运行线程
在一些情况下,您不需要线程顺序执行(但确实存在一些场景)。
好吧,如果你必须这样做。
那么你可以这样做
Thread t1 = ..
Thread t2 = ..
t1.start();
t1.join();
t2.start(); // t2 will start only when t1 dies
t2.join(); //
t3.start(); // t3 will start only when t2 dies..
但是上面的方法不好。因为对于其他线程,前一个线程
在实践中,我们应该把创建线程看作是一项昂贵的操作
并尝试重新使用
真正的问题通常是这样的,您必须执行任务T1、T2、T3、T4
按顺序但在不同的线程中,T1和T3必须在一个线程上运行,T2和T4必须在一个线程上运行
我得另找一个。
因此,这里我们可以使用两个线程,而不是4个线程。
Thread1将运行T1,Thread2将运行T2,Thread1将运行T3,依此类推
i、 e
所有任务将按顺序执行,但仅使用2个线程
你可以像下面这样解决这个问题
Thread1 ->run {
while(canIrun) {
executeTask(taskQueue1.next());
notifyThread2();
waitForThread2Signal();
}
}
Thread2 -.run {
while(canIrun) {
waitForThread1Signal();
executeTask(taskQueue2.next());
notifyThread1();
}
}
使用CyclicBarrier可以很容易地实现wait and notify方法。Umm…这个问题可以通过花2分钟阅读javadocs来回答。我在这里查看了,但没有发现任何对我有用的信息。Umm…这个问题可以通过花2分钟阅读javadocs来回答。我在这里查看了,但没有找到答案我找不到任何对我有用的信息。好的,谢谢,所以链接是不可能的。假设线程被异常实例化,那么调用join()方法(如果可能的话)有什么可能?Thread.currentThread().join();似乎可以工作,但不是我所期望的。创建了第一个线程实例,它完成了工作,但没有其他任何事情发生(其他线程不像只运行一次的线程那样被实例化)。好的,谢谢,所以链接是不可能的。假设线程被异常实例化,那么调用join()方法(如果可能的话)有什么可能呢?Thread.currentThread().join();似乎可以工作,但不像我预期的那样。创建了第一个线程实例,它完成了工作,但没有发生其他任何事情(其他线程不像只运行一次的线程那样实例化).+1-好的观点。启动一个线程并立即加入它否定了您可能从一开始就使用线程中获得的任何好处。+1-好的观点。启动一个线程并立即加入它否定了您可能从一开始就使用线程中获得的任何好处。呃,这是问题,而不是答案。问题是start()
返回void,这样你的代码就不会编译,就像OP一样。-1它应该解释为什么它不会为那些要求知道它是如何工作的人编译。学会阅读。我说它不会编译。呃,这是问题,而不是答案。重点是start()
返回void,这样你的代码就不会编译,就像OP一样。-1它应该解释为什么它不会编译给那些想知道它是如何工作的人。学会阅读。我说它不会编译。感谢你花时间编写一些示例并给出一些解释。:-)感谢您抽出时间,写了一些例子并作了一些解释。:-)