线程的创建有两种方法 一是继承Thread类 二是实现Runnable接口 其中的 Thread类 也实现了Runnable接口 两种方法都要重写run方法
继承Thread类
下面代码 Print类 继承了Thread 该类就可以当作线程使用 重写run方法时 就可以写上自己的代码逻辑 在Print类中时 是输出1- 51 的数
public class OutputNum {
public static void main(String[] args) throws InterruptedException {
Print print = new Print();
print.setName("子线程"); //设置线程名
print.start(); // 调用该线程
for (int i = 0; i < 30; i++) {
System.out.println(Thread.currentThread().getName() + " 线程进行中");
Thread.sleep(100); //主线程每 运行一次 休眠100毫秒
}
}
}
class Print extends Thread{
private int count;
@Override
public void run() {
while (true){
System.out.println(Thread.currentThread().getName() + ": " + (++count));
try {
Thread.sleep(100); //输出一次休眠 100毫秒
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
if (count > 50){ //结束该线程
break;
}
}
}
}
当主方法中调用start方法时 启动线程 最终会执行到 子线程中的 run方法
而 run方法只是一个普通的方法 并没有真正的启动一个线程 当main线程中
调用start方法 启动一个子线程时 main线程不会阻塞 会继续执行 这时main线程与该子线程交替执行
实现Runnable接口
因为java时单继承的 在一些情况下一个类可能已经继承了父类 这是就需要通过实现 Runnable接口 来创建线程
public class OutputNum {
public static void main(String[] args) throws InterruptedException {
Print print = new Print();
print.setName("子线程"); //设置线程名
Print02 print02 = new Print02();
Thread print2 = new Thread(print02);
print2.setName("子线程2"); //设置线程名字
print2.start(); // 调用该线程
print.start(); // 调用该线程
for (int i = 0; i < 30; i++) {
System.out.println(Thread.currentThread().getName() + " 线程进行中");
Thread.sleep(100); //主线程每 运行一次 休眠100毫秒
}
}
}
class Print02 implements Runnable{ //实现Runnable接口 开发线程
private int count;
@Override
public void run() {
while (true){
System.out.println(Thread.currentThread().getName() + ": " + (++count));
try {
Thread.sleep(100); //输出一次休眠 100毫秒
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
if (count > 50){ //结束该线程
break;
}
}
}
}
通过继承Thread 与 实现Runnable 接口来创建线程 本质上并没有什么区别 而且 Thread类 也实现了 Runnable接口 但是使用Runnable接口更加的适合多个线程共用一个资源的情况 也避免了单继承的限制 所以推荐使用实现Runnable接口的方式创建线程