`

Java多线程 Thread类 和 Runnable接口

 
阅读更多

Java的线程,即一个Thread实例。

Java的线程执行过程有两种实现方式:

        1. 子类继承Thread类,并且重写void run()方法。

        2. 自定义类实现Runnable接口,并且实现void run()方法。并在Thead构造时,将Runnable实例放入Thead。

 

 

一. Thread类

创建一个新线程必须实例化一个Thread对象。

使用方法:

1. 子类继承Thread类。重写Thread的run()方法。

2. 实例化该子类。

3. 执行Thread的start()方法启动一个线程。

 

 

例:

public class TestThread1 {
	public static void main(String args[]) {
		Runner1 r = new Runner1();    //新建线程。
		r.start();                    //线程开始执行。
		for(int i=0; i<100; i++) {
			System.out.println("Main Thread:------" + i);
		}
	}
}

class Runner1 extends Thread {    //继承Thread类。
	public void run() {
		for(int i=0; i<100; i++) {	
			System.out.println("Runner1 :" + i);
		}
	}
}

 

 

 

二. Runnable接口

实现Runnable接口需要实现run()方法.run()方法代表线程需要完成的任务.因此把run方法称为线程执行体.

使用方法:

1.类实现Runnable接口,并且实现run()方法。

public class MyRun implements Runnable{

    public void run(){

        //....mythread

    }

}

2.实例化该类。Runnable runnable=new MyRun();

3.把该类注入到Thread对象中,即通过Thread的构造方法注入。Thread thread=new Thread(runnable);

4.调用Thread实例的start()方法。启动线程。thread.start();

 

例:

public class TestThread1 {
	public static void main(String args[]) {
		Runner1 r = new Runner1(); 
		Thread t = new Thread(r);    //新建线程。
		t.start();                   //线程开始执行。
		
		for(int i=0; i<100; i++) {
			System.out.println("Main Thread:------" + i);
		}
	}
}

class Runner1 implements Runnable {    //实现Runnable接口
	public void run() {
		for(int i=0; i<100; i++) {	
			System.out.println("Runner1 :" + i);
		}
	}
}

 

 

 

三. 两种方式所创建线程的对比

实现Runnable接口方式的多线程:

1.编程稍复杂.

2.如果需要访问当前线程,必须使用Thread.currentThread()方法.

3.线程只是实现了Runnable接口,还可以继承其他类.

4.在这种方式下,可以多个线程共享同一个target对象,所以非常适合多个相同线程来处理同一份资源的情况,从而可以将CPU,代码,数据分开,形成清晰的模型,较好地体现了面向对象的思想.

 

继承Thread类方式的多线程:

1.编程简单.

2.如果需要访问当前线程直接使用this.

3.已经继承了Thread类,无法再继承其他父类.

 

 

四. Thread的常用API

1. Thread类的构造方法

Thread() 

Thread(Runnable target)

Thread(Runnable target, String name)

Thread(String name)

Thread(ThreadGroup group, Runnable target)

Thread(ThreadGroup group, Runnable target, String name)

Thread(ThreadGroup group, Runnable target, String name, long stackSize)

Thread(ThreadGroup group, String name)

 

2. 常用方法

(1) 启动线程

 void run() : 如果该线程是使用独立的 Runnable 运行对象构造的,则调用该 Runnable 对象的 run 方法;否则,该方法不执行任何操作并返回。 

void start() : 使该线程开始执行;Java 虚拟机调用该线程的 run 方法。 

 

(2) 线程状态控制

boolean isAlive()测试线程是否处于活动状态。 

int getPriority() 返回线程的优先级。 

void setPriority(int newPriority)  更改线程的优先级。

static void sleep(long millis)

static void sleep(long millis, int nanos)

当前线程暂停运行指定的毫秒数(加指定的纳秒数),但此线程不失去已获得的锁旗标.

void join() 等待该线程终止。 

void join(long millis) 等待该线程终止的时间最长为 millis 毫秒。

void join(long millis, int nanos) 等待该线程终止的时间最长为 millis 毫秒 + nanos 纳秒。 

static void yield() 暂停当前正在执行的线程对象,并执行其他线程。

 

Thread.State getState() 返回该线程的状态。 

 

void interrupt() 中断线程。 调用该方法引发线程抛出InterruptedException异常。

static boolean interrupted() 测试当前线程是否已经中断。 

boolean isInterrupted() :测试线程是否已经中断。

 

 

(3) 当前线程

static Thread currentThread() : 返回对当前正在执行的线程对象的引用。

String getName() : 返回该线程的名称.

void setName(String name) : 设置线程名称.

 

void setDaemon(boolean on) 将该线程标记为守护线程或用户线程。 

boolean isDaemon() :测试该线程是否为守护线程。 

String toString()  返回该线程的字符串表示形式,包括线程名称、优先级和线程组。

long getId() 返回该线程的标识符。

void checkAccess() 判定当前运行的线程是否有权修改该线程。 

ClassLoader getContextClassLoader() 返回该线程的上下文 ClassLoader。 

static Thread.UncaughtExceptionHandler getDefaultUncaughtExceptionHandler() 返回线程由于未捕获到异常而突然终止时调用的默认处理程序。 

Thread.UncaughtExceptionHandler getUncaughtExceptionHandler() 返回该线程由于未捕获到异常而突然终止时调用 的处理程序。 

 

 

(4) 线程组

static int enumerate(Thread[] tarray) 将当前线程的线程组及其子组中的每一个活动线程复制到指定的数组中。

StackTraceElement[] getStackTrace() 返回一个表示该线程堆栈转储的堆栈跟踪元素数组。 

static int activeCount() 返回当前线程的线程组中活动线程的数目。

ThreadGroup getThreadGroup() 返回该线程所属的线程组。 

 

(5) 其他

static Map<Thread,StackTraceElement[]> getAllStackTraces() 返回所有活动线程的堆栈跟踪的一个映射。

 

 

 

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics