一、多线程创建方法
法1:继承Thread类来创建一个新线程
通过继承Thread类来创建一个线程,重写run方法。run方法就是该线程要执行的任务,即一条新的执行路径。
演示代码:
//声明一个子类MyThread继承父类Thread
public class MyThread extends Thread {
@Override 重写run方法,内容是此线程要执行的任务。
public void run() {
for (int i = 0; i < 10; i++) {
System.out.println("锄禾日当午:" + i);
}
}
}
public class Demo1 {
//这是里主线程的执行路径
public static void main(String[] args) {
MyThread m = new MyThread();
m.start(); //调用start方法启动子线程
for (int i = 0; i < 10; i++) {
System.out.println("汗滴禾下土" + i);
}
}
}
主线程和子线程的执行先后顺序不一
法2:实现Runnable接口来创建一个新线程
//设置线程要执行的任务
public class MyRunnable implements Runnable {
@Override 线程的任务
public void run() {
for (int i = 0; i < 10; i ++) {
System.out.println("天气好" + i);
}
}
}
public class Demo2 {
public static void main(String[] args) {
//1. 创建一个任务对象
MyRunnable r = new MyRunnable();
//2. 创建一个线程,并传入任务
Thread t = new Thread(r);
//3. 开始执行此线程
t.start();
for (int i = 0; i < 10; i ++) {
System.out.println("我这边下雨呀" + i);
}
}
}
法3:使用Callable接口
不常用方式,以后补充。
二、Thread类常用方法
1、常用构造方法
- Thread()
分配一个Thread对象 - Thread(Runnable target)
分配一个Thread对象,并指定任务 - Thread(Runnable target, String name)
分配一个Thread对象,指定任务和线程名称 - Thread(String name)
分配一个Thread对象,指定线程名称
2、常用方法
-
getId()
获取线程ID -
getName()
获取线程名称 -
setName(String name)
设置线程名称。传入名称 -
int getPriority()
获取线程优先级 -
start()
启动线程 -
sleep(long millis)
即 public static void sleep(long millis) throws InterruptedException
线程休眠,传入要休眠的毫秒数 -
sleep(long millis, int nanos)
线程休眠,传入要休眠的毫秒+纳秒数 -
currentThread()
即 public static Thread currentThread()
返回当前正在执行的线程对象的引用
演示
public class MyRunnable implements Runnable {
@Override 线程的任务
public void run() { }
}
}
public class Demo3 {
public static void main(String[] args) {
MyRunnable r = new MyRunnable();
Thread t = new Thread(r);
t.start();
//获取线程ID
System.out.println("线程ID: " + t.getId());
//获取线程名称
System.out.println("线程名称: " + t.getName());
//设置线程名称
t.setName("1号线程");
System.out.println("线程名称: " + t.getName());
//获取线程优先级,默认是5
System.out.println("线程优先级: " + t.getPriority());
3、线程的结束
线程的结束 应由线程自身决定,不应使用stop方法强制中断线程,否则会导致线程占用的资源来不及释放
ublic class Demo3 {
public static void main(String[] args) {
Thread t1 = new Thread(new MyRunnable2());
t1.start();
for (int i = 0; i < 5; i++) {
//调用currentThread()获取当前正在执行的线程的引用
System.out.println(Thread.currentThread().getName() + ":" + i);
try {
Thread.sleep(1000); //休眠1秒
} catch (InterruptedException e) {
e.printStackTrace();
}
}
//给线程1添加中断标记
t1.interrupt();
}
static class MyRunnable2 implements Runnable {
public void run() {
for (int i = 0; i < 10; i++) {
System.out.println(Thread.currentThread().getName() + ":" + i);
try {
Thread.sleep(1000);
} catch(InterruptedException e) {
//System.out.println("发现了中断标记,但不死亡");
System.out.println("发现了中断标记,执行线程自杀");
return;
}
}
}
}
}
上述代码中,子线程并没有执行完for loop。
主线程和子线程每隔1秒打印一次。在主线程执行完for loop打印后,设置中断标记。当子线程发现中断标记后,就会结束run方法,释放资源。