Java回炉之多线程(一)
创建方法
- 继承Thread
- 实现Runable
设置获取线程名
- setName()
- getName()
- 默认线程名:Thread-x(x为编号)
获取当前线程
- Thread.getCurrentThread()
优先级
- 默认是5,最小1,最大10
- getPriority():获取优先级
- setPriority(int):设置优先级
线程控制
- Thread.sleep(long):让线程睡眠指毫秒值
- join():调用者执行完毕后再执行其他线程
- Thread.yield():让线程执行更和谐,但不能保证均分
- setDaemon():标记调用者为守护线程(代码执行者的守护线程;start()之前调用;被守护线程结束后,守护线程结束)
- stop():让线程停止(不安全)
- interrupt():让线程中断,并抛出异常
生命周期
- 新建:创建对象
- 就绪:有执行资格,但没执行权
- 运行:有执行资格,有执行权
- 阻塞:没有执行资格,没有执行权
- 死亡:对象等待回收
状态转换
同步代码块
- 参数在同步代码块内线程安全
- 用同一把锁(锁对象为同一个对象)
- 线程很多时,判断锁降低运行效率
- 锁对象可以使任意对象
synchronized(obj){
}
同步方法
- 同步方法的锁对象是this
- 静态同步方法的对象是class
private synchronized void method(){
}
Lock锁
实现类:ReentrantLock
- lock():获取锁(上锁)
- unlock():释放锁
一般lock()
在try
之前调用,unlock()
在finally
中调用。
- 示例
private void methodWithSync(){
synchronized(this){
//code...
}
}
private void methodWidthLock(){
Lock lock=new ReentrantLock();
lock.lock();
try{
//code...
}finally{
lock.unlock();
}
}
等待唤醒机制
生产者与消费者
- wait():等待
再次被唤醒时从此处之后开始运行。
- notify():唤醒单个线程
- notifyAll():唤醒所有线程
上述方法由“锁”来调用
线程组
- getThreadGroup():获取调用者(线程)所在线程组
- 默认情况下,所有的线程都属于同一个组
- new Thread(ThreadGroup,Runnable,NameString):在自定义组中创建线程
线程池
//创建线程池
ExecutorService pool = Executor.newFixedThreadPool(2);
//请求线程执行
pool.submit(new Runnable(){});
pool.submit(new Runnable(){});
pool.submit(new Callable(){});
//结束线程池
pool.shutDown();
定时器
- Timer
- Timer():创建定时器
- schedule(TimerTask task,long delay):延迟后执行
- schedule(TimerTask task,long delay,long period):延迟后之情,每隔一段时间执行一次
- cancle():终止任务
- TimerTask
- run():任务执行体