1,继承Thread方式的线程
2,推荐的创建线程方式:继承Runnalbe,使用Thread类
class MyThread implements Callable{
public Object call() throws Exception{
....
return null;
}
}
MyThread thread = new MyThread();
FutureTask f = new FutureTask(thread);
new Thread(f).start();
new Thread(f).start(); // 反复执行不会执行,需要定义新的task
try{
Object ret = f.get();// get()为返回值,会阻塞主线程执行
}catch(InterruptedException){
}catch(Execution e){
}
线程池 第四种方式
//Executors 工具类
//ExecutorService 接口
ExecutorService service = Executors.newFixedThreadPool(10);
ThreadPoolExecutor executor = (ThreadPoolExecutor)service;
executor.setxxx() //设置参数
service.execute(Runnable);
service.submit(Callable);
service.shutdown();
3,Thread常用方法
getPriority() | setPrioority(1,5,10) | |
---|---|---|
currentThread() 静态方法 | getName() | setName() |
yield() 释放cup执行权,变为就绪状态 | join():在A线程中B.join() ,A就阻塞,B执行完到A | |
stop() :过时方法,强制结束线程 | sleep(ms) | isAlive() |
4,线程分类
守护线程,用户线程
守护线程服务用户线程
thread.setDaemon(true) //设置为守护线程
5,线程生命周期
阻塞---》就绪:sleep,join结束获取同步锁,notify,resume:过时方法
6,注意
wait,notify,notifyall,必须在同步方法快内,方法内,不能使用lock,他们调用时是锁对象.wait,要注意 此时syn(锁对象),两个所对象必须相同
ReentrantLock lock = new ReentrantLock();
final Condition flag1=lock.newCondition();
final Condition flag2=lock.newCondition();
try{
lock.lock();
flag1.await();
...
}finally{
lock.unlock();
}
flag2.singal();
定制化通信:
/* 例:
* 切菜
* 炒菜
* 上菜
* 同时10道菜
*/
// 这里就不能用sync,需要定制化通信(唤醒睡眠的线程)
// 顺序:线程 操作 资源类
Cooking
Lock
condation flag1,flag2,flag3
cut()
cooking()
gaving()
Cooking
new thread(()->{
for(int i=0;i<5;i++)
cooking.cut();
}).start()
new thread(()->{
for(int i=0;i<5;i++)
cooking.cooking();
}).start()
new thread(()->{
for(int i=0;i<5;i++)
cooking.giving();
}).start()
数据库中读写一般不是同步的
JUC中读写都是同步的,即读写同步,因为JVM线程必须加锁,否则不安全,比数据库严格
CountDown count = new CountDown(10);
count.await(); // 到此方法时会判断count里面的数值,为0时继续主线程,适用于秒杀业务
CyclicBarrier = cyc = new CyclicBarrier(7,任务)
for (int i=0;i<7;i++)
new Thread(){
()->{
xxxxx
cyc.await();
}
}
Sempahere s= new Semaphere(3);
for (int i=0;i<7;i++)
new Thread(){
()->{
s.acquire();// 资源不够时会阻塞
xxxx
s.release();// 表示释放了资源
}
}