Java多线程

1.线程的创建和启动

Java使用Thread类代表线程,所有线程对象都必须是Thread类或者子类的实例。每条线程的作用是完成一定的任务,实际是就是执行一段程序流。Java使用run方法来封装这样一段程序流。

1)继承Thread类创建线程类

步骤如下:

定义Thread类的子类,并重写该类的run方法,该run方法的方法体就是代表了线程需要完成的任务。因此我们经常把run方法称为线程执行体。

创建Thread子类的实例,即床加你了线程对象。

用线程对象的start方法来启动该线程

public class ThreadTest extends Thread {
	private int i;

	public void run() {
		for (; i < 100; i++) {
			System.out.println(getName() + " " + i);
		}
	}

	public static void main(String args[]) {
		new ThreadTest().start();
		new ThreadTest().start();
	}
}


 

线程的一些方法:

Thread.currentThread():currentThread是Thread类的静态方法,该方法总是返回当前正在执行的线程对象。

getName():该方法是Thread的实例方法,该方法返回调用该方法的线程名字。

2)通过实现Runnable接口创建线程类

实现Runnable接口来创建并启动多条线程的步骤如下:

定义Runable接口的实现类,并重写该接口的run方法,该run方法的方法体同样是该线程的线程执行体。

创建Runnable实现类的实例,并以此实例作为Thread的target来创建Thread对象,该Thread对象才是真正的线程对象。

public class ThreadTest2 implements Runnable {

	@Override
	public void run() {
		// TODO Auto-generated method stub
		System.out.println("当前线程"+Thread.currentThread().getName()+"在运行!");
	}
	
	public static void main(String args[]){
		ThreadTest2 a= new ThreadTest2();
		ThreadTest2 a1= new ThreadTest2();
		Thread b= new Thread(a);
		b.start();
		new Thread(a1).start();
	}

}


 

注意:Runnable进京位置Thread 对象的target,Runnable实现类里包含了run方法仅作为线程执行体,而实际的线程对象依然是Thread实例,只是该Thread线程负责执行其target的run方法。Java语言的Thread必须使用Runnable对象的run方法作为线程执行体。

2.线程的生命周期

线程生命周期有五种状态:

新建(New),就绪(Runnable),运行(Running),阻塞(Blocked)和死亡(Dead).

1)新建和就绪状态:

当程序使用new关键字创建了一个线程后,该线程就处于新建状态,此时它和其他Java对象一样,仅仅由Java虚拟机为其分配了内存,并初始化了其成员变量的值。此时线程对象没有表现出任何线程的动态特征。

当线程对象调用了start()方法之后,线程就处于就绪状态,Java虚拟机会为其创建方法调用栈和程序计数器,处于这个状态中的线程并没有开始运行,它只是表示线程可以运行了,至于该线程何时运行,取决于JVM里的线程调度器。

2)运行和阻塞状态

如果处于就绪状态的线程获得了CPU,开始执行run方法的线程执行体,则该线程处于运行状态

但是当发生如下情况时:线程进入阻塞状态

1.线程调用sleep方法主动放弃所占用的处理器资源。

2.线程调用了一个阻塞式的IO方法,该方法返回之前,该线程被阻塞

3.线程视图获得一个同步监视器,该同步监视器正好被其他线程所持有。

4.线程子啊等待某个通知

5.程序调用了suspend方法将线程挂起。

但是当前线程在如下几种情况下又可以解除阻塞,进入就绪状态

1.调用sleep方法的线程经过了指定的时间。

2.i线程调用的阻塞式IO方法已经返回

线程成功获得了同步监视器

线程正在等待某个通知时,其他线程发出了一个通知

处于挂起状态的线程调用了resume恢复方法。

3.线程死亡

线程会以以下三种方式结束,结束后就处于死亡状态:

1)run()方法执行完成,线程正常结束

2)线程poaching一个未捕获的Exception或Error

3)直接调用该线程的stop方法结束该线程,该方法容易导致死锁,不推荐使用。

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值