一 线程创建
在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类创建线程的好处就是在Thread类中已经封装了各种方法,
方便我们编程。
缺点就是在一个已经拥有父类的类中无法通过继承Thread的方式创建线程,
因为java不支持多继承。
2. 通过实现Runnable接口,实现run方法
实现Runnable接口创建完Runnable对象后,如何创建线程?
Thread类API构造方法如下:
从构造方法可以看出,将创建完的Runnable对象,通过Thread类的构造方法,就能分配新的线程对象。
eg:
package com.lanhuigu.JavaBase.thread.createthread;使用Runnable的好处在于可以在多态中创建线程,当一个类已经有一个父类,
/**
* 通过实现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("多线程技术--代码运行结果与代码执行顺序或调用顺序无关");
}
}
需要在这个类上创建线程时,就不能通过继承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();
}
}