Thread和Runnable创建线程

时间:2022-11-14 17:35:16

一 线程创建

在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{

@Override
public void run() {
// TODO Auto-generated method stub
System.out.println("通过继承Thread类创建线程");
}

public static void main(String[] args) {
MyThread thread1 = new MyThread();

thread1.start();
System.out.println("多线程技术--代码运行结果与代码执行顺序或调用顺序无关");
}
}
程序运行结果如下:

Thread和Runnable创建线程

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

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


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

方便我们编程。

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

因为java不支持多继承。


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

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

Thread类API构造方法如下:

Thread和Runnable创建线程

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

eg:

package com.lanhuigu.JavaBase.thread.createthread;
/**
* 通过实现Runnable接口,实现run方法,创建线程
*/
public class MyRunnable implements Runnable{

@Override
public void run() {
// TODO Auto-generated method stub
System.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类中的某些已经封装好的方法。


注:

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


二 Thread类中某些方法

1. currentThread

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

eg:

package com.lanhuigu.JavaBase.thread.generalmethod;
/**
* Thread类中的currentThread()方法,返回当前的线程对象
*/
public class CurrentThreadMethod extends Thread{
@Override
public void run() {
// TODO Auto-generated method stub
System.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{
@Override
public void run() {
// TODO Auto-generated method stub
try {
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 block
e.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{
@Override
public void run() {
// TODO Auto-generated method stub
System.out.println("线程ID=" + Thread.currentThread().getId());
}

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