/**
 * 自定义执行单元的两种方式
 * 区别
 * runnable避免了单继承的局限性
 * runnable资源可以被独立共享
 * 多线程如何找问题
    1.明确哪些代码是多线程运行代码
    2.明确哪些是共享数据
    3.明确多线程代码中哪些语句是操作共享数据的
 * @author WangShuang
 *
 */
public class Test {
    public static void main(String[] args) {
        /*MyThread t0=new MyThread();
        MyThread t1=new MyThread();
        t0.start();
        t1.start();//出现两百张票
*/      
        //t0.start();//java.lang.IllegalThreadStateException

        /*MyRunnable r=new MyRunnable();
        Thread rt0 = new Thread(r);
        Thread rt1 = new Thread(r);
        rt0.start();
        rt1.start();*/

    }
}
/**
 * 方式1继承Thread
 * 如果想实现两个窗口买票的话
 * MyThread t0=new MyThread();
   MyThread t1=new MyThread();
   t0.start();
   t1.start();//出现两百张票
       如果在tick前面加static能解决问题,但是生命周期又太长,所以采用方式2
 * @author Administrator
 *
 */
class MyThread extends Thread{
    /*static 加static不好 生命周期太长*/ int tick = 100;
    @Override
    public void run() {
        while(tick>0){
            System.out.println(tick--);
        }
    }
}
/**
 * 方式2实现Runnable接口
 * @author Administrator
 *
 */
class MyRunnable implements  Runnable {
    int tick = 100;
    @Override
    public  void run() {
        synchronized (new Object()) {
            while(tick>0){
                System.out.println("                     "+this.toString());
                System.out.println(Thread.currentThread().getName()+"         "+tick--);
            }
        }
    }
}