两个带有线程池的方法分别执行两组线程任务,第二个方法需要等待第一组任务执行完毕
2016-08-17 09:47
387 查看
如下两种解决方案其中一个会影响效率,另一个可能会有未知风险,如果谁有更好的解决方案,谢谢分享。
package thread;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.FutureTask;
public class CallableAndFuture {
public static void main(String[] args) throws InterruptedException, ExecutionException {
List<FutureTask<Integer>> taskList=method1();
for(FutureTask<Integer> task:taskList){
task.get();
}
System.out.println();
System.out.println("*****任务一******全部执行结束****");
System.out.println();
method2();
System.out.println();
System.out.println("………………任务二…………是否执行结束?????,一般情况还没有哦!");
System.out.println();
}
public static List<FutureTask<Integer>> method1(){
ExecutorService executor = Executors.newCachedThreadPool();
List<FutureTask<Integer>> taskList=new ArrayList<FutureTask<Integer>>();
for(int i=0;i<5;i++){
TheadTask1 task = new TheadTask1();
FutureTask<Integer> futureTask = new FutureTask<Integer>(task);
executor.submit(futureTask);
taskList.add(futureTask);
}
return taskList;
}
public static List<FutureTask<Integer>> method2(){
ExecutorService executor = Executors.newCachedThreadPool();
List<FutureTask<Integer>> taskList=new ArrayList<FutureTask<Integer>>();
for(int i=0;i<5;i++){
TheadTask2 task = new TheadTask2();
FutureTask<Integer> futureTask = new FutureTask<Integer>(task);
executor.submit(futureTask);
taskList.add(futureTask);
}
return taskList;
}
}
class TheadTask1 implements Callable<Integer> {
@Override
public Integer call() throws Exception {
System.out.println("Task11111111111111111111111111111开始工作");
Thread.sleep((long) (Math.random() * 6000));
System.out.println("Task11111111111111111111111111111----结束工作"+Thread.currentThread().getName());
return 1;
}
}
class TheadTask2 implements Callable<Integer> {
@Override
public Integer call() throws Exception {
System.out.println("Task22222222222222222222222222222开始工作");
Thread.sleep((long) (Math.random() * 6000));
System.out.println("Task22222222222222222222222222222----结束工作"+Thread.currentThread().getName());
return 1;
}
}
第二种方案:
package thread;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Semaphore;
public class SemaPhore {
private static final Semaphore semp = new Semaphore(1);
public static void main(String[] args) throws InterruptedException {
method();
}
public static void method() throws InterruptedException{
method1();
//Thread.sleep(1000*2);
method2();
}
public static void method1() throws InterruptedException{
semp.release();
ExecutorService exec = Executors.newCachedThreadPool();
for(int i=0;i<5;i++){
Task1 task1=new Task1();
exec.execute(task1);
}
// 退出线程池
exec.shutdown();
System.out.println("method1");
while (true) {
if (exec.isTerminated()) {
System.out.println("--method111--准备释放信号灯");
semp.acquire();
break;
}
Thread.sleep(200);
}
//
}
public static void method2() throws InterruptedException{
semp.release();
// 线程池
ExecutorService exec = Executors.newCachedThreadPool();
for(int i=0;i<5;i++){
Task2 task2=new Task2();
exec.execute(task2);
}
// 退出线程池
exec.shutdown();
while (true) {
if (exec.isTerminated()) {
System.out.println("--method222--准备释放信号灯");
semp.acquire();
break;
}
Thread.sleep(200);
}
}
}
class Task1 implements Runnable{
@Override
public void run() {
try {
System.out.println("Task11111111111111111111111111111开始工作");
Thread.sleep((long) (Math.random() * 6000));
System.out.println("Task11111111111111111111111111111----结束工作"+Thread.currentThread().getName());
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
class Task2 implements Runnable{
@Override
public void run() {
try {
System.out.println("Task22222222222222222222222222222开始工作");
Thread.sleep((long) (Math.random() * 6000));
System.out.println("Task22222222222222222222222222222----结束工作"+Thread.currentThread().getName());
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
package thread;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.FutureTask;
public class CallableAndFuture {
public static void main(String[] args) throws InterruptedException, ExecutionException {
List<FutureTask<Integer>> taskList=method1();
for(FutureTask<Integer> task:taskList){
task.get();
}
System.out.println();
System.out.println("*****任务一******全部执行结束****");
System.out.println();
method2();
System.out.println();
System.out.println("………………任务二…………是否执行结束?????,一般情况还没有哦!");
System.out.println();
}
public static List<FutureTask<Integer>> method1(){
ExecutorService executor = Executors.newCachedThreadPool();
List<FutureTask<Integer>> taskList=new ArrayList<FutureTask<Integer>>();
for(int i=0;i<5;i++){
TheadTask1 task = new TheadTask1();
FutureTask<Integer> futureTask = new FutureTask<Integer>(task);
executor.submit(futureTask);
taskList.add(futureTask);
}
return taskList;
}
public static List<FutureTask<Integer>> method2(){
ExecutorService executor = Executors.newCachedThreadPool();
List<FutureTask<Integer>> taskList=new ArrayList<FutureTask<Integer>>();
for(int i=0;i<5;i++){
TheadTask2 task = new TheadTask2();
FutureTask<Integer> futureTask = new FutureTask<Integer>(task);
executor.submit(futureTask);
taskList.add(futureTask);
}
return taskList;
}
}
class TheadTask1 implements Callable<Integer> {
@Override
public Integer call() throws Exception {
System.out.println("Task11111111111111111111111111111开始工作");
Thread.sleep((long) (Math.random() * 6000));
System.out.println("Task11111111111111111111111111111----结束工作"+Thread.currentThread().getName());
return 1;
}
}
class TheadTask2 implements Callable<Integer> {
@Override
public Integer call() throws Exception {
System.out.println("Task22222222222222222222222222222开始工作");
Thread.sleep((long) (Math.random() * 6000));
System.out.println("Task22222222222222222222222222222----结束工作"+Thread.currentThread().getName());
return 1;
}
}
第二种方案:
package thread;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Semaphore;
public class SemaPhore {
private static final Semaphore semp = new Semaphore(1);
public static void main(String[] args) throws InterruptedException {
method();
}
public static void method() throws InterruptedException{
method1();
//Thread.sleep(1000*2);
method2();
}
public static void method1() throws InterruptedException{
semp.release();
ExecutorService exec = Executors.newCachedThreadPool();
for(int i=0;i<5;i++){
Task1 task1=new Task1();
exec.execute(task1);
}
// 退出线程池
exec.shutdown();
System.out.println("method1");
while (true) {
if (exec.isTerminated()) {
System.out.println("--method111--准备释放信号灯");
semp.acquire();
break;
}
Thread.sleep(200);
}
//
}
public static void method2() throws InterruptedException{
semp.release();
// 线程池
ExecutorService exec = Executors.newCachedThreadPool();
for(int i=0;i<5;i++){
Task2 task2=new Task2();
exec.execute(task2);
}
// 退出线程池
exec.shutdown();
while (true) {
if (exec.isTerminated()) {
System.out.println("--method222--准备释放信号灯");
semp.acquire();
break;
}
Thread.sleep(200);
}
}
}
class Task1 implements Runnable{
@Override
public void run() {
try {
System.out.println("Task11111111111111111111111111111开始工作");
Thread.sleep((long) (Math.random() * 6000));
System.out.println("Task11111111111111111111111111111----结束工作"+Thread.currentThread().getName());
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
class Task2 implements Runnable{
@Override
public void run() {
try {
System.out.println("Task22222222222222222222222222222开始工作");
Thread.sleep((long) (Math.random() * 6000));
System.out.println("Task22222222222222222222222222222----结束工作"+Thread.currentThread().getName());
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
相关文章推荐
- 进阶篇:等待多个子线程完毕再执行主线程的方法之CountDownLatch(十二)
- 一种利用线程池线程执行任务, 并能够结束超时任务的方法 (.NET实现)
- C#等待所有子线程执行完毕方法
- 方法一 Java如何判断线程池所有任务是否执行完毕
- c#等待所有子线程执行完毕方法
- java中等待一些线程执行完之后,再去执行别的方法(后者需要使用前者返回的结果)
- java中等待一些线程执行完之后,再去执行别的方法(后者需要使用前者返回的结果)
- c#等待所有子线程执行完毕方法
- C# 在两个不同的方法里面Lock同一个锁对象,是否需要线程等待?
- 等待线程池内线程执行完成的一种方法
- 线程池等待一定数目的线程执行完毕之后返回结果
- c#等待所有子线程执行完毕方法
- 多线程线程池控制一个方法的并发量 限制只有5个线程执行任务
- C#等待所有子线程执行完毕方法
- java 等待线程/线程池执行完毕
- Java多线程--让主线程等待所有子线程执行完毕
- 如何判断线程池里的线程全部执行完毕
- 线程A分为A1,A2两个步骤,A1执行完毕后通知线程B,线程B执行完毕后通知线程A,线程A接下来执行步骤A2
- Java如何判断线程池所有任务是否执行完毕
- winform c#调用外部EXE程序,并等待外部EXE程序执行完毕才执行下面的代码的方法。