3.Thread类中的方法:
currentThread():静态方法,返回当前线程对象,该方法通过Thread调用,Thread.currentThread()
方法在哪个线程中执行,就返回该线程对象
getName():通过线程对象调用,获取该线程名称(主线程默认是main,新开辟的线程以编号顺延(Thread-0,Thread-1.....))
sleep(long mills):让线程在执行的毫秒数休眠,如果线程休眠,CPU切换其它线程执行
当醒来后,该线程CPU重新切换到(该线程重新获取CPU的执行权),才能接着Thread.sleep(毫秒之值);
继续向下执行,如果sleep()方法在同步代码块中中使用,当执行该方法,不会释放锁
4.多线程安全问题:
a. public class Demo_02Ticket implements Runnable {
// 成员位置,定义100张票
private int tickets = 100;
// Lock lock = new ReentrantLock();
private Object obj = new Object();
public void run() {
while (true) {
if (tickets > 0) {
try {
Thread.sleep(10); //以一种错误分析:
//①当tickets=1 CPU切换到 Thread-0 执行 Thread.sleep(10); Thread-0睡眠
//②CPU切换到 Thread-1 tickets>0 执行 Thread.sleep(10);Thread-1睡眠
//③CPU切换到 Thread-2 tickets>0 执行 Thread.sleep(10); Thread-2睡眠
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName() + " 出售第 " + tickets--);//④CPU 切换Thread-0 ,此时Thread-0睡醒,继续向下执行
} //tickets--先使用,后自减,先打印1,tickets=tickets-1;tickets=0
//⑥CPU切换到Thread-1,此时Thread-1睡醒,继续向下执行
} //tickets--先使用,后自减,先打印0,tickets=tickets-1;tickets=-1
} //⑦CPU切换到Thread-2,此时Thread-2睡醒,继续向下执行
} //tickets--先使用,后自减,先打印-1,tickets=tickets-1;tickets=-2
}
public static void main(String[] args) {
Demo_02Ticket ticket = new Demo_02Ticket();
Thread t0 = new Thread(ticket);
Thread t1 = new Thread(ticket);
Thread t2 = new Thread(ticket);
t0.start();
t1.start();
t2.start();
}
产生问题原因:Thread-0操作共享数据(tickets),操作了一半,结果CPU切换到另外一个线程执行,可能导致共享数据错误 |
|