1 run中常写成while的形式
2 旧代码
for(int i=0;i<5;i++){
new Thread(new R1()).start();
}
新代码
ExecutorService exec = Executors.newCachedThreadPool();
for(int i=0;i<5;i++){
exec.execute(new R1());
}
exec.shutdown();
3三种ThreadExecutor
CacheedThreadPool
FixedThreadPool
SingleThreadExecutor
它们可以无参、也可以传入一个ThreadFactory
4
带返回值的线程
Callable
call()
submit()
Future<?>
get()
isDone()
public class C1 implements Callable<String> {
private int id;
public C1(int id) {
super();
this.id = id;
}
public String call() {
return "return" + id;
}
}
public class T1 {
public static void main(String[] args) throws InterruptedException, ExecutionException {
ExecutorService exec = Executors.newCachedThreadPool();
for(int i=0;i<10;i++){
Future<String> result = exec.submit(new C1(i));
System.out.println(result.get());
}
exec.shutdown();
}
}
5 sleep()会抛出异常。
6 yield()是建议。 让给同优先级。 重要场合不能依赖。
7 setDeamon()设置成后台程序。当所有非后台结束时,后台程序自动结束。
8 run中的异常无法自己抛出。
解决方法:
自己捕获
or
自定义UncaughtExceptionHandler
9