线程的创建:
方式1:
private class Task implements Runnable{
@Override
public void run() {
// doSomething
}
}
/*************** 开启线程 ***********************/
Thread thread = new Thread(new Task());
thread.start();
方式2:
private class MyThread extends Thread {
@Override
public void run() {
// doSomething
}
}
/******************* 开启线程 ******************************/
MyThread myThread = new MyThread();
myThread.start();
有返回值的线程
方式1:
private class MyCallable implements Callable<String> {
@Override
public String call() throws Exception {
return "线程执行结果";
}
}
FutureTask<String> futureTask = new FutureTask<String>(new MyCallable()) {
// 异步线程完成后的回调
@Override
protected void done() {
try {
// 获取执行结果
String result = get();
} catch (InterruptedException e) {
e.printStackTrace();
} catch (ExecutionException e) {
e.printStackTrace();
}
}
};
Thread t = new Thread(futureTask);
t.start();
方式2:
ExecutorService executorService = Executors.newSingleThreadExecutor();
Future<?> submit = executorService.submit(futureTask);
//executorService.execute(futureTask);
try {
String result = (String) submit.get();
} catch (InterruptedException e) {
e.printStackTrace();
} catch (ExecutionException e) {
e.printStackTrace();
}
线程池的使用
- newFixedThreadPool: 创建固定数量的线程数的线程池,如果线程池中的线程都处于活动状态,此时提交任务就在队列中等待。
ExecutorService executorService = Executors.newFixedThreadPool(3);
executorService.execute();
- newSingleThreadExecutor: 创建一个只有一个线程的线程池
ExecutorService executorService1 = Executors.newSingleThreadExecutor();
executorService1.execute(task);
- newScheduledThreadPool: 核心线程为n,最大线程无限的线程池
ScheduledExecutorService executorService = Executors.newScheduledThreadPool(n);
// 第一次延迟10秒之后执行task,之后每隔20秒执行一次task
executorService.scheduleAtFixedRate(task,10,20, TimeUnit.SECONDS);
- newCachedThreadPool: 创建可缓存的线程池,如果线程池中的线程在60秒未被使用就将被移除,在线程池中有之前创建的可用线程就宠用可用线程,否则就新建一条线程。
ExecutorService executorService = Executors.newCachedThreadPool();
executorService.execute(task);