1 public class beginning { 2 3 private static final Runnable String = null; 4 5 public static void main(String[] args) { 6 Ticket t = new Ticket(); // 创建一个Runnable对象 7 Thread t1 = new Thread(t); //创建四个线程,同时跑Thread(可接收Runnable对象) 8 Thread t2 = new Thread(t); 9 Thread t3 = new Thread(t); 10 Thread t4 = new Thread(t); 11 t1.start(); 12 t2.start(); 13 t3.start(); 14 t4.start(); 15 16 } 17 } 18 19 class Ticket implements Runnable 20 { 21 private int tick = 100; 22 public void run() 23 { 24 while (true) 25 { 26 if(tick > 0) 27 { 28 System.out.println(Thread.currentThread().getName()+"sale:"+tick--); 29 } 30 else 31 { 32 break; 33 } 34 35 } 36 } 37 }
sleep(long millis)方法抛出异常了 - 以毫秒为单位的休眠时间
具体如下: public static void sleep(long millis) throws InterrruptedException
所以用的时候要抛出或者try,Runnable由于是接口,故不能抛,只能try。
通过分析: 发现,打印出0,-1,-2等错票。
多线程的运行出现了安全问题。
原因: 当多条语句操作线程共享数据时,一个线程对多条语句只执行了一部分,还没有执行完。
另一个线程参与进来执行。导致共享数据的错误。
解决办法: 对多条操作共享数据的语句,只能让一个线程都执行完,再执行过程中其它线程不可以参与执行。
Java对于多线程的安全问题,提供了专业的解决方式。
即:同步代码块。
synchronized(对象)
{
需要被同步的代码。
}
同步的前提:
1、必须要有两个或者两个以上的线程
2、必须是多个线程适用同一个锁。
必须保证同步中只能有一个线程在运行。
好处:解决了多线程的安全问题。 弊端:多个线程都需要判断锁,较为消耗资源。