继承
Thread
类,然后复写run()
方法,直接new
,然后start()
class Th1 extends Thread {
@Override
public void run() {
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getId());
}
}
Thread thread1=new Th1();
thread1.start();
实现
Runnable
接口,复写run()
,new一个Thread(target)
,target是Runnable
,然后start()
class Th2 implements Runnable {
@Override
public void run() {
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getId());
}
}
Thread thread1 = new Thread(new Th2());
thread1.start();
实现
Callable
接口,复写call()
接口,call
可以有返回值,然后使用FutureTask
包装
class Th3 implements Callable<String> {
@Override
public String call(){
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getId());
return "i am result";
}
}
FutureTask<String> futureTask = new FutureTask<>(new Th3());
new Thread(futureTask).start();
String result = futureTask.get(3, TimeUnit.SECONDS);
System.out.println(result);
Executors
是一个Java中的工具类 ,阿里巴巴代码规范中禁止使用,因为LinkedBlockingQueue
如果不设置大小,它的大小就是int最大值,这样就造成OOM
BlockingQueue
是用来存放还未执行的任务的队列
我们使用
ThreadPoolExecutor
setMaximumPoolSize()
修改Runable
或者Callable
submit()
,参数是第一步的Runable
或者Callable
,如果使用Runable
,可以在第二个参数(可选参数)添加一个结果get()
,注意此操作是阻塞的
shutdownNow()
和shutdown()
,shutdown()
会阻止添加任务,阻止未开始的任务执行,并且等正在执行的任务完成后,关闭线程池;shutdownNow()
会阻止添加任务,阻止未开始的任务执行并且尝试中断所有线程,可能会抛出异常.ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(
3,
10,
60L,
TimeUnit.SECONDS,
new ArrayBlockingQueue<>(10));
// Future<?> submit = threadPoolExecutor.submit(new Th2(),"我是Th2的结果");
Future<?> submit = threadPoolExecutor.submit(new Th3());
// 获取结果
System.out.println(submit.get());
//关闭线程池
threadPoolExecutor.shutdown();
原文:https://www.cnblogs.com/lyalong/p/java_thread.html