1,线程基础
1,继承Thread方式的线程
- 当需要再此启动一个线程时,需要再创建对象,不能重复使用。
2,推荐的创建线程方式:继承Runnalbe,使用Thread类
-
1.5之前就这两种
-
callable 第三种
-
可以有返回值 call()
-
可以抛出异常
-
支持泛型返回值
-
需要借助FutureTask, 如获取返回值的时候
-
class MyThread implements Callable{ public Object call() throws Exception{ .... return null; } } MyThread thread = new MyThread(); FutureTask f = new FutureTask(thread); new Thread(f).start(); 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) //设置为守护线程
- 最简单程序main主线程与gc回收线程
- 若没有用户线程jvm则结束
5,线程生命周期
- NEW : 创建对象
- RUNNABLE :运行 start
- BLOCKED:阻塞 sleep,join,等待同步锁,wait,suspend:过时方法
- WAITING:wait()
- TIMED-WAITING:wait(time)
- TERMINATED:stop,exception,run结束
阻塞---》就绪:sleep,join结束获取同步锁,notify,resume:过时方法
6,注意
- wait:阻塞,会释放锁,必须在synchronized内
- sleep:阻塞,不会释放锁,任何时候可以
wait,notify,notifyall,必须在同步方法快内,方法内,不能使用lock,他们调用时是锁对象.wait,要注意 此时syn(锁对象),两个所对象必须相同
2,线程同步
-
同步代码块
- 要求所有相乘同一把锁 synchronized(obj) obj是同一个对象,或同一个类
-
同步方法:当方法内容全部需要同步时
- 非静态方法锁即时this 需要注意
- 静态方法时,锁时当前类本身
-
Lock :接口 1.5之后
-
能够手动开启同步,结束同步
-
ReentrantLock lock = new ReentrantLock(); try{ lock.lock(); ... }finally{ lock.unlock(); }
-