Java 线程的启动和停止

概要:

Java中实现多线程有两种方法:一种是继承Thread类;另一种是实现Runnable接口。本实例介绍运用这两种方式创建线程并启动各停止线程。

| |目录

技术要点

    实现启动和停止线程的技术要点如下:   

    线程类继承Thread类的语法:

 (public) class 类名 extends Thread{
        public void run(){//这里写线程的内容}
  }

    线程类实现java.lang.Runnable类的语法:

(public)class类名implements Runnable{
        public void run(){//这里写线程的内容}
}

    一般鼓励使用第二种方法,Java只允许单一继承,但允许实现多个接口。第二种方法更加灵活。

    调用Thread类的start()方法启动一个线程,调用方法后,线程准备启动,当获得CPU资源时,start()方法将自动调用run()方法,线程才真正开始运行。

    停止线程的方式有很多,可以使用Thread类的interrupt()方法停止线程;可以设置一个布尔类型的变量flag=true,当要结束进程时,将flag设置为false;也可以使用stop()方法,不过该方法已经废弃,但可以用在死锁。

代码实现

package net.xsoftlab.baike; 
import java.util.Date; 
class OneThread extends Thread { // 继承java.lang.Thread类定义线程
	private boolean running = false; // 标记线程是否需要运行
	public void start() { // 覆盖了父类的start方法,
		this.running = true; // 将running置为ture,表示线程需要运行
		super.start();
	}
	public void run() {
		int i = 0;
		try {
			while (running) { // 如果running为真,说明线程还可以继续运行
				System.out.println("线程 " + i++);
				Thread.sleep(200); // sleep方法将当前线程休眠。
			}
		} catch (Exception e) { // 捕获异常
		}
		System.out.println("线程结束...");
	}
	public void setRunning(boolean running) { // 设置线程
		this.running = running;
	}
	public void startThreadA() { // 启动ThreadA线程
		System.out.println("启动线程...");
		this.start();
	}
	public void stopThreadA() { // 停止ThreadA线程
		System.out.println("结束线程...");
		this.setRunning(false);
	}
}
class TwoThread implements Runnable { // 实现java.lang.Runnable接口定义线程
	private Date runDate; // 线程被运行的时刻
	public void run() {
		System.out.println("线程启动方法...");
		this.runDate = new Date();
		System.out.println("启动时间:" + runDate);
	}
}
public class TextThreadStartOrStop { // 操作线程启动和停止的类
	public void startOne() {
		OneThread threadOne = new OneThread();// 创建实例
		threadOne.startThreadA(); // 启动ThreadA线程
		try {
			Thread.sleep(1000); // 当前线程休眠一秒钟
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
		threadOne.stopThreadA(); // 停止ThreadA线程
	}
	public void startTwo() { // 开始第二个
		Runnable tb = new TwoThread(); // 创建实例
		Thread threadB = new Thread(tb); // 将实例放入线程中
		threadB.start(); // start方法启动线程
	}
	public static void main(String[] args) { // java程序主入口处
		TextThreadStartOrStop test = new TextThreadStartOrStop(); // 实例化对象
		test.startOne(); // 调用方法
		test.startTwo();
	}
}

程序解读

  1. OneThread类继承Thread类来实现线程功能,TwoThread类实现Runnable接口来实现线程功能。这两种方式实现线程功能,都需要实现run()方法。启动线程使用Thread类的start()方法,如果类是继承Thread类,则真接调用对象的start()方法;如果类实现的是Runnable()接口,需要将对象封装成Thread类,再调用封装后对象的start()方法。

  2. 如果一个类需要实现多个线程的功能,只能通过实现Runnable接口的方式把自己定义为线程类。由于Java只允许单一继承,继承Thread类是不能实现这个功能的。

  3. OneThread类定义一个标识判断线程是否需要运行。当线程运用start()方法启动时,将该标识设置为真,如果为真则一直循环,如果设置为假则结束循环,线程也就停止了。因此,在需要线程停止时运用stopThreadA()方法调用setRunning()方法将标识设置为假便可。该类中的run()方法调用线程的sleep()方法是使当前线程进入休眠状态。


评论关闭
评论 还能输入200
评论关闭
评论 还能输入200
  • 全部评论(0)
资料加载中...
已关注 , 取消