线程的两种实现方式

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的生命周期变长了。

猜你喜欢

转载自3056434592.iteye.com/blog/2342390