我在代码中使用了以下代码段。
ExecutorService executor = Executors.newFixedThreadPool(4);
while(loop 50 times){
//In the extreme case I will have 50 threads and only 4 will be active and remaining are in queue
MyThread myThread = new MyThread();
executor.execute(myThread);//Each Thread process 100,000 records and put in a file
}
executor.shutdown();
while (!executor.isTerminated()) {
}
以下是我的问题:
请帮我解决这个问题。
答案 0 :(得分:4)
1.挂在第二个循环中。可能是什么原因?
挂起的原因可能是因为与需要处理和存储在文件中的记录数量相比,线程非常少。如果每个线程应该处理100,000个记录并放入文件,那么由4个线程共享的50个线程任务将必须处理包含50个文件的5,000,000条记录。所以最好增加线程数并检查。另请注意,如果通过增加固定池线程数减少整体时间,每个线程有效测量的时间会缩短。
2.在某段时间后有没有办法终止整个线程池?
以下代码显示: -
executor.shutdown();
executor.awaitTermination(60, TimeUnit.SECONDS); // blocks/waits for certain interval as specified
executor.shutdownNow(); // Forcefully terminate entire thread pool after the above time.
3.我可以在一定的时间间隔后终止一个帖子吗?
是的,如果有效终止线程的原因是停止正在执行的任务。为了实现这一点,我们需要获得对未来的参考,并在我们强制取消任务并中断执行任务的线程之前有条件地等待一段时间。
Map<String, Future> tasks = new HashMap<String, Future>();
while(i++ < 50){
//In the extreme case I will have 50 threads and only 4 will be active and remaining are in queue
Thread myThread = new Thread();
tasks.put("Thread"+i ,executor.submit(myThread));//Each Thread process 100,000 records and put in a file
}
// say you want to terminate Thread2 after 60 seconds
Future thread2Task = tasks.get("Thread2");
thread2Task.get(60, TimeUnit.SECONDS);
thread2Task.cancel(true); // boolean whether you want to interrupt the thred forcefully
答案 1 :(得分:1)
ExecutorServise将有一个Threads池来执行Runnable任务,你将池的大小定义为4,我会将其更改为机器中的cpus数:
int threadCount = Runtime.getRuntime().availableProcessors();
ExecutorService executor = Executors.newFixedThreadPool(threadCount);
此外,您似乎正在向执行程序发送线程以在其池中的一个可用线程中执行它们,这是多余的,您可以将MyThread更改为Runnable任务。 / p>
答案 2 :(得分:-1)
你这样做是错误的。线程池总是占用runnable的对象。虽然线程类实现了一个可运行的接口,但它不接受线程类对象。您需要声明一个可运行的对象,然后通过多态行为为它提供线程类对象,它将运行该线程 你需要这样做:
ExecutorService name = Executors.newFixedThreadPool(no of threads yu want);
for(i = 0 ; i < no of threads ; i++)
{
Runnable runnable = new MyThread();
name.execute(runnable)
}
\\ now you can terminate the thread like this. if you want
\\ to wait then you can use
\\executor.awaitTermination(60, TimeUnit.SECONDS);
executor.shutdown();
while(!executor.isTerminated()) {}
System.out.println("Finished all the worker threads");