在Java中设计并发线程时使用Runnable和Callable接口有什么区别,为什么要选择一个而不是另一个呢?
在这段代码中,两者的连接和分解意味着什么?t1.join()导致t2停止直到t1终止?
Thread t1 = new Thread(new EventThread("e1"));
t1.start();
Thread t2 = new Thread(new EventThread("e2"));
t2.start();
while (true) {
try {
t1.join();
t2.join();
break;
} catch (InterruptedException e) {
e.printStackTrace();
}
}
Run Code Online (Sandbox Code Playgroud) 简单地等待所有线程进程完成的方法是什么?例如,假设我有:
public class DoSomethingInAThread implements Runnable{
public static void main(String[] args) {
for (int n=0; n<1000; n++) {
Thread t = new Thread(new DoSomethingInAThread());
t.start();
}
// wait for all threads' run() methods to complete before continuing
}
public void run() {
// do something here
}
}
Run Code Online (Sandbox Code Playgroud)
我如何改变这一点,以便main()方法在注释处暂停,直到所有线程的run()方法都退出?谢谢!
我用a ExecutorService来执行任务.此任务可以递归地创建提交给它的其他任务,ExecutorService这些子任务也可以这样做.
我现在遇到的问题是,在我继续之前,我要等到所有任务完成(即所有任务都完成并且他们没有提交新任务).
我不能ExecutorService.shutdown()在主线程中调用,因为这可以防止新任务被接受ExecutorService.
ExecutorService.awaitTermination()如果shutdown没有被召唤,呼叫似乎什么都不做.
所以我有点卡在这里.ExecutorService要看到所有工人都闲着,这不是很难,是吗?我能想出的唯一不合理的解决方案是直接使用a ThreadPoolExecutor并getPoolSize()偶尔查询它.这样做真的没有更好的方法吗?
ExecutorService pool=Executors.newFixedThreadPool(7);
List<Future<Hotel>> future=new ArrayList<Future<Hotel>>();
List<Callable<Hotel>> callList = new ArrayList<Callable<Hotel>>();
for(int i=0;i<=diff;i++){
String str="2013-"+(liDates.get(i).get(Calendar.MONTH)+1)+"-"+liDates.get(i).get(Calendar.DATE);
callList.add(new HotelCheapestFare(str));
}
future=pool.invokeAll(callList);
for(int i=0;i<=future.size();i++){
System.out.println("name is:"+future.get(i).get().getName());
}
Run Code Online (Sandbox Code Playgroud)
现在我想invokeAll在进入for循环之前将pool放到所有任务中,但是当我运行这个程序for循环时,在此之前执行invokeAll并抛出此异常:
java.util.concurrent.ExecutionException: java.lang.NullPointerException at
java.util.concurrent.FutureTask$Sync.innerGet(Unknown Source) at
java.util.concurrent.FutureTask.get(Unknown Source) at
com.mmt.freedom.cheapestfare.TestHotel.main(TestHotel.java:6??5)
Caused by: java.lang.NullPointerException at
com.mmt.freedom.cheapestfare.HotelCheapestFare.getHotelCheap?estFare(HotelCheapes??tFare.java:166)
at com.mmt.freedom.cheapestfare.HotelCheapestFare.call(HotelChe??apestFare.java:219)
at com.mmt.freedom.cheapestfare.HotelCheapestFare.call(HotelChe??apestFare.java:1)
at java.util.concurrent.FutureTask$Sync.innerRun(Unknown Source) at java.util.concurrent.FutureTask.run(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source) atjava.util.concurrent.ThreadPoolExecutor$Worker.run(Unknow??n Source)
at java.lang.Thread.run
Run Code Online (Sandbox Code Playgroud) 我想从事多线程,但我目前的项目没有这样的机会.有人请指导我应该从哪里开始.我需要实时场景,以便我可以直接跳转到编码.我也是并排阅读.
你可以参考一些网站进行练习吗?
问题描述 : -
第1步:在主线程中从用户处输入FILE_NAME.
步骤2: 对该文件执行10次操作(即计数字符,计数行等),所有这10个操作必须在隔离线程中.这意味着必须有10个子线程.
第3步:主线程等待所有子线程完成.
第4步:打印结果.
我做了什么 :-
我做了3个线程的示例代码.我不希望你身边的文件操作代码.
public class ThreadTest {
// This is object to synchronize on.
private static final Object waitObject = ThreadTest.class;
// Your boolean.
private static boolean boolValue = false;
public final Result result = new Result();
public static void main(String[] args) {
final ThreadTest mytest = new ThreadTest();
System.out.println("main started");
new Thread(new Runnable() {
public void run() {
System.out.println("Inside thread");
//Int initialiser
new Thread(new Runnable() {
public …Run Code Online (Sandbox Code Playgroud) 当用户启动我的Android应用程序时,我会启动2个线程在后台进行一些处理.thread_1在客户端上进行一些计算,而thread_2从服务器获取一些数据.一切正常.没有线程修改UI.我有两个跟进问题.
new Thread(new Runnable(){
@Override
public void run(){
MyClass.someStaticVariable = doSomeCalculations();
}
}).start();
Run Code Online (Sandbox Code Playgroud)
从线程的run()方法检索数据的最佳实践是什么?我目前有一个静态变量,我将相关计算数据/获取数据分配给它.或者是否建议使用Handler类从线程中获取数据?我想如果他们想要更新UI,只使用处理程序.
while(true)
{
if (!thread1.isAlive() && !thread2.isAlive())
{
startActivity(intent)
}
}
Run Code Online (Sandbox Code Playgroud)我需要等到两个线程都完成后再通过Intent从两个线程传递数据.我怎样才能做到这一点?我可以使用上面显示的代码来完成它,但这似乎是错误的.
我正在尝试测试一个在单独的线程中工作的方法,简化它是这样的:
public void methodToTest()
{
Thread thread = new Thread()
{
@Override
public void run() {
Clazz.i = 2;
}
};
thread.start();
}
Run Code Online (Sandbox Code Playgroud)
在我的单元测试中,我想测试Clazz.i == 2,但我不能这样做,因为我认为断言是在线程更改值之前运行的.我想使用另一个线程来测试它,然后使用join等待,但它仍然无法正常工作.
SSCCE:
@Test
public void sscce() throws InterruptedException
{
Thread thread = new Thread()
{
@Override
public void run() {
methodToTest()
}
};
thread.start();
thread.join();
AssertEquals(2, Clazz.i);
}
public static class Clazz
{
public static int i = 0;
}
Run Code Online (Sandbox Code Playgroud)
我认为这是因为测试主代码创建了一个等待(加入)第二个线程的线程,但是第二个线程没有完成工作,它创建另一个线程来完成工作然后完成,这继续第一个线程,而第三个线程Clazz.i = 2在断言后执行.
我怎样才能使第一个线程等待它启动的线程以及该线程启动的任何线程?