两种线程启动方式

一、利用Thread子类
//以下的代码代表一个线程,输入一百次message,这个message通过构造参数传入(这个线程就是Thread的子类)

package threadTest;

public class TwoThread extends Thread {
         private String message;
         public TwoThread(String message)
         {
        	 this.message=message;
         }

		@Override
		public void run() {
			for(int i=0;i<100;i++)
			{
				System.out.print(message+" ");
			}
			
		}
         
         
}

//以下代码代表在主线程中启动两个子线程

package threadTest;

public class MyTest {

	public static void main(String[] args) {
		new TwoThread("Good!").start();
		new TwoThread("Nice!").start();

	}

}

分析:
通过Thrad子类启动线程步骤
(1)创建Thraed子类,重写run方法,run方法的函数体就是这个线程的执行逻辑
(2)在主线程中(主函数中)创建Thraed子类的对象
(3)对象调用start()方法,代表启动线程。
注意:
(1)再不调用start()之前,线程是不会被启动的,只有调用了start()方法后才会启动线程,调用子类的run方法。
(2)”TwoThread实例“和“线程本身”不是一个东西,即便创建了TwoThread 实例,线程也没有启动(因为要调用start()方法才可以);反过来,即便线程结束了,TwoThread 实例也还是存在的
(3)整个程序执行过程:
主线程在main方法中启动两个子线程,随着main方法终止,主线程也就终止了,但是整个程序没有终止
直到两个子线程都终止后,程序才终止
(4)两个子线程执行过程
因为电脑只有一个CPU,所以这是属于“并发处理的顺序执行”(这也是为什么并发其实在某一时刻,就是只有一个命令是在Cpu上执行的,但是由于轮换执行得很快,所以宏观上就是多个命令同时进行),即输出Good!的线程运行一会儿就停止,然后再运行Nice!的线程,这样交互着来,所以输出100个Good!和100个Nice是交叉着输出的
(5)要是有多个CPU的话,就是“并发处理的并行运行”,就可能是一个cpu执行输出Good!的线程,一个cpu执行Nice!的线程。
二、实现Runnable接口(实现功能与上面一样,也是两部分,对应上面的)

package threadTest;

public class TwoThread implements Runnable{
         private String message;
         public TwoThread(String message)
         {
        	 this.message=message;
         }

         @Override
		public void run() {
			for(int i=0;i<100;i++)
			{
				System.out.print(message+" ");
			}
			
		}
         
         
}

package threadTest;

public class MyTest {

	public static void main(String[] args) {
		TwoThread t1=new TwoThread("Good!");
		TwoThread t2=new TwoThread("Nice!");
		new Thread(t1).start();
		new Thread(t2).start();
	}

}

利用实现Runnable接口的方式启动多线程的步骤
(1)创建实现Runnable接口的实现类,并在里面重写run方法
(2)在主线程中创建实现类的实例,然后以这个实例作为参数来创造Thread类的实例。
(3)最后是Thread实例调用start()方法来启动子线程
总结:
(1)所以无论哪种方法,最后都是是调用Thraed类的start()方法来启动子线程,不同的是前者直接是创建子类对象,然后调用start()。后者是创建对象,还要利用这个对象作为参数创建Thread对象,再调用start()方法。
(2)利用Runnable实现类的方式优势在于线程类只是继承了Runnable接口,还可以继承其他类,在这种方法下,多个线程可以共享一个target对象,就像new Thread(t1).start();new Thread(t1).start();共享t1对象。这种非常适合多个相同线程处理同一份资源,从而将CPU,代码和数据分开,形成清晰的模型。劣势是变成复杂度太高。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值