2016.12.02
明天,哦不对,准确来说应该是今天考现场总线,就看了一点,但求不挂,今年的课都不知所云,练车,上课,实验,考试,各种忙。哈哈,不过值得庆幸的是,连续几天敲代码,竟然有了感觉,现在遇到了各种牛人,感觉能学到好多东西,也深深体会到自己作为一个学渣该好好学习了。
自定义线程一般有两种方式:
方式一:
1.自定义一个类继承Thread类
2.重写Thread类中的run方法,把自定义线程的任务写在run()方法上
3.创建Thread的子类对象,并且调用start方法启动一个线程
注意:千万不要直接调用run()方法,调用start方法的时候线程开启,线程开启就会直接调用run();如果直接调用run()方法,就相当于调用了一个普通方法。
方式二:
1.自定义一个类实现Runnable接口。
2.实现Runable接口的run方法,把自定义线程的任务定义在run()方法上。
3.创建Runnable实现类对象。
4.创建Thread类的对象,并且把Runnable()实现类的对象作为参数进行传递。
5.调用Thread对象的start方法开启一个线程。
public class Demo2 implements Runnable{ public void run(){ for(int i=0;i<100;i++){ System.out.println(Thread.currentThread().getName()+":"+i); } } public static void main(String[] args) { //创建Runnable实现类的对象 Demo2 d = new Demo2(); //创建Thread类的对象, 把Runnable实现类对象作为实参传递。 Thread t = new Thread(d,"庹成");//Thread类使用Target变量记录了d对象, //调用thread对象的start方法开启线程。 t.start(); /* Thread类 的run方法 * @Override public void run() { if (target != null) { target.run(); //就相当于Runnable实现类的对象的run方法作为了Thread对象的任务代码了。 } } */ } }
这里有两个问题:
问题1.请问Runnable实现类的对象是线程对象吗?
Runnable实现类的对象不是一个线程对象,只不过是实现了Runnable接口的对象而已。
问题2.为什么要把Runnable实现类的对象作为实参传递给Thread对象呢?作用是什么?
作用就是把Runnable实现类的对象的run()方法作为了线程的任务代码去执行了。
推荐使用第二种,实现Runnable接口。因为java是单继承,多实现的
class SaleTicket implements Runnable{ int num = 50; // 票数 @Override public void run() { while(true){ synchronized ("锁") { if(num>0){ System.out.println(Thread.currentThread().getName()+"售出了第"+ num+"号票"); num--; }else{ System.out.println("售罄了.."); break; } } } } } public class Demo4 { public static void main(String[] args) { //创建了一个Runnable实现类的对象 SaleTicket saleTicket = new SaleTicket(); //创建三个线程对象模拟三个窗口 Thread thread1 = new Thread(saleTicket,"窗口1"); Thread thread2 = new Thread(saleTicket,"窗口2"); Thread thread3 = new Thread(saleTicket,"窗口3"); //开启线程售票 thread1.start(); thread2.start(); thread3.start(); } }
这里为什么不用static来修饰int num,会不会产生150张票,答案是不会,因为只创建了一个SaleTicket对象,加了之后不会怎样,就是java的生命周期变长了。