相关代码来源:学习马士兵老师的课程。
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());
});
}
}
}