Java 多线程(一) 线程的创建

现代操作系统中,进程是资源分配的基本单位,而线程是调度的基本单位。一个进程内可以有多个线程,而这些线程可以共享进程的资源,比如内存资源,IO资源。 大家开发常用的Eclipse启动后就是一个进程,而使用它的不同功能会启动对应不同的线程,如代码编辑版块是一个线程在处理,视图(按钮,鼠标点击等)响应是另一个线程在处理。多线程提升了处理器的使用效率,因为在一个线程空闲时,处理器可以调用其他线程,宏观上来看,一个时间段内,有多个任务同时在执行,称为并发。

想象我们是一个武侠世界中的男主角,要完成的任务的有练功,研读武功秘籍,吃饭。武功秘籍厚厚一本,如果只能单任务顺序处理,读完秘籍再练功,再吃饭,也许就饿死了。在多任务并发执行的情况下,我们为每个人物启动一个线程,可以看一会秘籍,然后练功,饿了就吃饭,吃了饭之后再继续看书,练功。在读完秘籍的过程中,穿插了练功和吃饭。

      JDK提供了对多线程的支持,本文介绍JAVA中线程如何创建。

      1.通过继承Thread类创建线程

     我们建立一个练功的线程。

public class Practise extends Thread{

	
	public Practise(String name) {
		super(name);
	}
	
	//线程执行时调用此方法
	@Override
	public void run() { 
		System.out.println("Thread:"+Thread.currentThread().getName()+" is running");
	}

	public static void main(String[] args) {
		//新建MyThread实例,传入给线程起的名字
		 Practise practise = new Practise("Practise");
                 practise.start();//启动线程}
         }


 
Thread类时JDK提供的实现线程相关操作的类,我们要创建自己的线程类Hero,只需要继承Thread类,然后实现run方法,最后调用Hero实例的start方法,即启动了线程。线程想要做的事,编写在run方法里,线程在启动后,会自己执行run方法。上述代码的run方法输出正在调用该方法的线程名称。我们新建Hero实例时,传入了一个String,这是在定义该线程的名称,在run方法中,我们通过 
Thread.currentThread().getName()
就可以输出定义的线程名称。

上述代码执行结果为

Thread:Practise is running

这里要注意,我们要通过practise.start()启动线程后,run方法才是被我们新建的practise线程调用,使用practise.run()只是调用run方法,并没有启动一个新的线程。
public class Practise extends Thread{

	
	public Practise(String name) {
		super(name);
	}
	
	//线程执行时调用此方法
	@Override
	public void run() { 
		System.out.println("Thread:"+Thread.currentThread().getName()+" is running");
	}

	public static void main(String[] args) {
		//新建MyThread实例,传入给线程起的名字
		Practise practise = new Practise("Practise");
		//practise.start();//启动线程
		practise.run();
		
	}

}

输出:Thread:main is running

我们换成直接在main方法里执行practise.run().输出结果:Thread:main is running. 线程名跟之前的不一样了,说明调用run方法的线程变成了main线程,而不是practise线程。main线程是调用main方法的线程。

2.通过实现runnable接口创建线程

上述介绍的通过继承Thread类来创建线程,有一定的局限性,因为Java不支持多继承,所以如果一个类已经继承过其他类,则无法通过继承Thread类来创建线程。Java提供了Runnable接口,通过实现该接口,也可以创建线程。

public class Practise implements Runnable{

	
	@Override
	public void run() {
		System.out.println("Thread:"+Thread.currentThread().getName()+" is running");
	}
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Practise practise = new Practise();
                Thread t = new Thread(practise,"Practise");
		t.start();	
	}
	
}

输出结果:Thread:Practise is running


如上述代码所示,输出结果与继承Thread类的结果相同。我们需要先实例化实现了Runnable接口的类,然后将其作为参数传给一个Thread的实例对象,最后通过Thread实例对象的start方法来启动线程。



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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值