Thread和Runnable创建线程

来源:互联网 发布:nmt tensorflow 编辑:程序博客网 时间:2024/05/22 01:46

一 线程创建

在java中,创建线程有两种方式:

(1) 通过继承Thread类,重写run方法

(2) 通过实现Runnable接口,实现run方法

1. 通过继承Thread类,重写run方法

Thread类源码结构:

public class Thread implements Runnable {

  // .....省

}

该类实现Runnable接口,在Runnable接口基础上增加了方法和属性。

eg:

package com.lanhuigu.JavaBase.thread.createthread;/** *通过继承Thread类,重写run方法,创建线程 */public class MyThread extends Thread{@Overridepublic void run() {// TODO Auto-generated method stubSystem.out.println("通过继承Thread类创建线程");}public static void main(String[] args) {MyThread thread1 = new MyThread();thread1.start();System.out.println("多线程技术--代码运行结果与代码执行顺序或调用顺序无关");}}
程序运行结果如下:

从运行结果,可以知道,代码的运行结果与代码执行顺序或代码调用顺序无关。

线程虽然先启动,但是线程下面的代码确先执行完。


使用继承Thread类创建线程的好处就是在Thread类中已经封装了各种方法,

方便我们编程。

缺点就是在一个已经拥有父类的类中无法通过继承Thread的方式创建线程,

因为java不支持多继承。


2. 通过实现Runnable接口,实现run方法

实现Runnable接口创建完Runnable对象后,如何创建线程?

Thread类API构造方法如下:

从构造方法可以看出,将创建完的Runnable对象,通过Thread类的构造方法,就能分配新的线程对象。

eg:

package com.lanhuigu.JavaBase.thread.createthread;/** * 通过实现Runnable接口,实现run方法,创建线程 */public class MyRunnable implements Runnable{@Overridepublic void run() {// TODO Auto-generated method stubSystem.out.println("通过实现Runnable接口创建线程");}public static void main(String[] args) {MyRunnable runnable = new MyRunnable();Thread thread1 = new Thread(runnable);thread1.start();System.out.println("多线程技术--代码运行结果与代码执行顺序或调用顺序无关");}}
使用Runnable的好处在于可以在多态中创建线程,当一个类已经有一个父类,

需要在这个类上创建线程时,就不能通过继承Thread类创建线程,因为java不支持多继承,

只能通过实现Runnable接口创建线程。

不完美的就是我们不能用Thread类中的某些已经封装好的方法。


注:

(1) Thread和Runnable创建多线程方式在本质上没有区别。

(2) 多次调用start方法,将会抛出IllegalThreadStateException。


二 Thread类中某些方法

1. currentThread

Thread类中的currentThread()方法,返回当前的线程对象

eg:

package com.lanhuigu.JavaBase.thread.generalmethod;/** * Thread类中的currentThread()方法,返回当前的线程对象 */public class CurrentThreadMethod extends Thread{@Overridepublic void run() {// TODO Auto-generated method stubSystem.out.println("ThreadName = " + Thread.currentThread().getName());}public static void main(String[] args) {CurrentThreadMethod currentThreadMethod = new CurrentThreadMethod();currentThreadMethod.start();}}

2. sleep

Thread类中的sleep(long millis)方法让当前正在执行的线程休眠指定毫秒数

eg:

package com.lanhuigu.JavaBase.thread.generalmethod;/** * Thread类中的sleep(long millis)方法让当前正在执行的线程休眠指定毫秒数 */public class SleepMethod extends Thread{@Overridepublic void run() {// TODO Auto-generated method stubtry {System.out.println("ThreadName = " + Thread.currentThread().getName()+ " begin time = " + System.currentTimeMillis());Thread.sleep(3000);// 休眠3000毫秒(3秒)System.out.println("ThreadName = " + Thread.currentThread().getName()+ " end time = " + System.currentTimeMillis());} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}}public static void main(String[] args) {SleepMethod sleepThread = new SleepMethod();sleepThread.start();}}

3. getId

获取线程id

package com.lanhuigu.JavaBase.thread.generalmethod;/** * 获取线程id */public class GetIdMethod extends Thread{@Overridepublic void run() {// TODO Auto-generated method stubSystem.out.println("线程ID=" + Thread.currentThread().getId());}public static void main(String[] args) {GetIdMethod getIdThread = new GetIdMethod();getIdThread.start();}}

原创粉丝点击