本文已参与「新人创作礼」活动,一起开启掘金创作之路。
方式一: 继承Thread类
# main
public static void main(String[] args) {
// 2. 创建Thread或者Thread子类对象
MyThread mythread = new MyThread();
// 3.调用Thread类中的start方法,开启新线程,执行run方法
mythread.start();
// 主线程会继续执行主方法中的代码
for (int i = 0; i < 10; i++) {
System.out.println("main" + i);
}
}
# 输出
main0
run0
main1
main2
main3
方式二:实现Runnable接口:
// 1. 创建一个Runnable接口的实现类
public class RunnableImpl implements Runnable {
// 2. 重写Runnable中的run方法
@Override
public void run() {
for (int i = 0; i < 5; i++) {
System.out.println(Thread.currentThread().getName() + i);
}
}
}
# main
public static void main(String[] args) {
// 3. 创建Runnable接口的实现类对象
Runnable runable = new RunnableImpl();
// 4. 创建Thread类对象,构造方法中传递Runnable接口的实现类
Thread thread1 = new Thread(runable);
// 5. 开启新线程
thread1.start();
// 链式编程:简化接口的方式
new Thread(new Runnable() {
@Override
public void run() {
System.out.println(Thread.currentThread().getName() + "--->" + "程序员");
}
}).start();
}
Thread和Runnable的区别
- 适合多个相同的程序代码的线程去共享同一个资源
- 可以避免java中的单继承的局限性。
- 线程池只能放入实现Runable或Callable类线程,不能直接放入继承Thread的类。
线程停止
1.run任务运行完自动停止 2.使用变量来控制run方法使线程停止,即通知方式
// 通知方式
public class Demo02RunnableStop {
public static void main(String[] args) throws InterruptedException {
T t = new T();
Thread thread = new Thread(t);
thread.start();
Thread.sleep(5000);
t.setLoop(false);
}
}
class T implements Runnable {
private Boolean loop = true;
int count = 1;
public void setLoop(Boolean loop) {
this.loop = loop;
}
@Override
public void run() {
while (loop) {
try {
System.out.println("T 运行中。。。" + count);
Thread.sleep(2000);
count++;
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
线程中断
interrupt, 中断线程,但并没有真正的结束线程。所以一般用于中断正在休眠的线程
线程插队
- yield:线程让步。让出CPU,让其他线程执行,但礼让的时间不确定,所以不一定礼让成功。