Java基础编程(20)---线程池

相关代码来源:学习马士兵老师的课程。

1、Executor 的简单实用

package com.test;

import java.util.concurrent.Executor;

public class T01Executor implements Executor {

public static void main(String[] args){
new T01Executor().execute(
()->System.out.println("hello")
);
}
@Override
public void execute(Runnable command) {
command.run();
}
}


2、FixedThreadPool的概念和使用

package com.test;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;import java.util.concurrent.TimeUnit;

public class T05_TheadPool {
public static void main(String[] args) {
ExecutorService service = Executors.newFixedThreadPool(5);
for(int i=0;i<6;i++){
service.execute(()->{  
try {
TimeUnit.MILLISECONDS.sleep(500);
} catch (Exception e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName());
});
}
System.out.println(service);
service.shutdown();
System.out.println(service.isTerminated());
}

}


3、Future的使用

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.FutureTask;
import java.util.concurrent.TimeUnit;

public class T06_Future {
public static void main(String[] args) throws Exception, Exception {
//FutureTask包装了一个任务(未来)
//()->相当于new Callable(){Integer call()}
FutureTask<Integer> task = new FutureTask<>(()->{
TimeUnit.MILLISECONDS.sleep(1500);
return 1000;
});
new Thread(task).start();
System.out.println(task.get()); //阻塞
//submit有返回值,execute没有返回值
ExecutorService service = Executors.newFixedThreadPool(5);
FutureTask<Integer> f = (FutureTask<Integer>) service.submit(()->{
TimeUnit.MILLISECONDS.sleep(500);
return 1;
});

System.out.println(f.isDone());
System.out.println(f.get());
System.out.println(f.isDone());
}
}


4、质数的计算

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.Future;

public class T07_ParallelComputing {

public static void main(String[] args) throws InterruptedException, ExecutionException {
long start = System.currentTimeMillis();
List<Integer> results = getPrime(1, 200000);
long end = System.currentTimeMillis();

System.out.println(end - start);

                final int cpuCreNum = 4;

ExecutorService service = Executors.newFixedThreadPool(cpuCreNum);
Mytask t1 = new Mytask(1, 80000);
Mytask t2 = new Mytask(80001, 130000);
Mytask t3 = new Mytask(130001, 170000);
Mytask t4 = new Mytask(170000, 200000);

Future <List<Integer>> f1 = service.submit(t1);
Future <List<Integer>> f2 = service.submit(t2);
Future <List<Integer>> f3 = service.submit(t3);
Future <List<Integer>> f4 = service.submit(t4);

start = System.currentTimeMillis();
f1.get();
f2.get();
f3.get();
f4.get();
end = System.currentTimeMillis();
System.out.println(end - start);

}

static class Mytask implements Callable<List<Integer>>{
 int startPos,endPos;
  Mytask(int s ,int e){
 this.startPos = s ;
 this.endPos = e;
  }
@Override
public List<Integer> call() throws Exception {
List<Integer> r = getPrime(startPos, endPos);
return r;
}
}

static boolean isPrime(int num){
for(int i=2;i<num/2;i++){
if(num%i==0){
return false;
}
}
return true;
}

static List<Integer> getPrime(int start,int end){
List<Integer> result = new ArrayList<Integer>();
for(int i=start;i<=end;i++){
if(isPrime(i)){
result.add(i);
}
}
return result;
}
}


5、CachedThreadPool 的简单使用

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;
public class T08_CachPool {
public static void main(String[] args) throws InterruptedException {
        ExecutorService service = Executors.newCachedThreadPool();
for(int i=0;i<2;i++){
service.execute(()->{  
try {
TimeUnit.MILLISECONDS.sleep(500);
} catch (Exception e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName());
});
}
System.out.println(service);
TimeUnit.SECONDS.sleep(80);
System.out.println(service);
}
}


6、SingleThread 的简单使用

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;

public class T09_SingleThread {
public static void main(String[] args) {
       ExecutorService service = Executors.newSingleThreadExecutor();
for(int i=0;i<6;i++){
int j = i;
service.execute(()->{  
try {
TimeUnit.MILLISECONDS.sleep(500);
} catch (Exception e) {
e.printStackTrace();
}
System.out.println(j+" "+ Thread.currentThread().getName());
});
}
}
}










猜你喜欢

转载自blog.csdn.net/zzf604/article/details/80014201