线程的一些重要的方法
- Sleep:导致当前线程进入阻塞状态,阻塞的时间达到了指定的时间,当前线程从阻塞状态进入就绪状态,等待cpu 下次调度。在阻塞的过程中,如果当前对象持有监视器对象上的锁,那么该锁不会被释放。
- Join:导致当前线程进入阻塞状态,调用join 方法的线程对象优先被调度执行(相对于被阻塞的线程)。被阻塞的线程,当调用join 方法的线程对象执行完毕之后,解除阻塞状态,进入就绪。先start 后 join。
- Yield:导致当前线程从运行状态进入就绪状态。
- SetPriority(int) 设置线程优先级。线程的优先级从1-10.默认是5. 10 最大。被cpu 调度的概率最高。
- SetDaemon(Boolean ) 设置线程为 守护线程,或者非守护线程。
线程同步(线程安全的实现方式):
1、同步代码块:显示指定监视器对象的。synchronized(obj) { // obj为同步监视器 }
2、同步方法:本质上也是同步代码块,隐士指定监视器对象。this public synchronized...方法名(参数列表){ }
注意:同步监视器只能是对象,推荐使用共享资源的对象,可以当前 对象 this,也可以是其它的对象;
同步方法无需调用同步监视器,因为同步方法的对象只能是当前对象this;
实现同步的前提:
必须要有两个或以上的线程,必须是所有的线程使用同一个锁,这样保证同步中只能有一个线程在运行。
线程同步代码示例(三个窗口卖票代表三个线程,30人排队,一共只有10张票):
Ticket类:
public class Ticket2 implements Runnable{
private int ticket=6; //六张票
@Override
public void run() {
for(int i=0;i<30;i++) { //表示30人排队买票
//调用同步方法
saleTicket();
}
}
private synchronized void saleTicket() {//同步方法无需调用同步监视器,因为同步方法的对象只能是当前对象this
if(ticket>0) {
try {
Thread.sleep(300);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()+"--正在售--第"+(ticket--)+"张票");
}
}
}
TestTicket类:
public class TestTicket {
public static void main(String[] args) {
Ticket2 ticket=new Ticket2();
Thread t1=new Thread(ticket, "A窗口");//传入Runnable实例,并取个名字
Thread t2=new Thread(ticket, "B窗口");
Thread t3=new Thread(ticket, "C窗口");
//启动线程
t1.start();
t2.start();
t3.start();
}
}