Java创建线程的方法
1、通过继承 Thread 类来创建一个线程
2、通过实现 Runnable 接口来创建一个线程
一、继承Thread类
1、继承Thread类后,必须重写run()方法
2、语法格式
public ClassName extends Thread{
run(){}
}
3、Thread的构造器参考
-
Thread()
-
Thread(String name) //指定线程的名称
-
Thread(Runnable target) //包装Runnable接口
-
Thread(Runnable target, String name)
-
Thread(ThreadGroup group, Runnable target)
-
Thread(ThreadGroup group, String name)
4、编程实战
文件:ThreadDemo.java
//线程类
class MyThread extends Thread{
@Override
public void run() {
System.out.println("我是一个线程");
super.run();
}
}
public class ThreadDemo {
public static void main(String[] args) {
//创建一个线程实例
MyThread t = new MyThread();
//线程的启动使用 start 方法
t.start();
}
}
-
使用 start() 方法启动线程,线程会进入 Runnable(可运行) 状态,它将向线程调度器注册这个线程,等待CPU资源;
-
不要直接在程序中调用线程的 run() 方法
二、实现Runnable接口来创建一个线程
1、实现Runnable接口,实现 run() 方法
2、Runnable接口没有start()方法,必须用Thread包装才可以启动
3、编程实战
class MyRunnable implements Runnable{
@Override
public void run() {
System.out.println("实现Runnable接口的线程");
}
}
public class ThreadDemo {
public static void main(String[] args) {
MyRunnable r = new MyRunnable();
// Runnable接口没有start()方法,必须用Thread包装才可以启动
// t.start(); //报错
new Thread(r).start(); //创建一个线程实例
}
}
-
Runnable不能直接start()
-
参考上方Thread的构造器
三、两种线程创建方式的比较
1、使用Runnable接口
-
可以将代码和数据分开,形成清晰的模型
-
还可以从其他类继承
-
保持程序风格的一致性
2、直接继承Thread类
-
不能再从其他类继承
-
编写简单,可以直接操纵线程
四、多线程和单线程
如果不创建Thread,那么我们这个程序(进程)就只有一个线程(main),也就是单线程的;
如果创建了Thread,那么这个程序(进程)就是多线程的;
可以尝试多创建几个线程,并加上打印当前线程的名称,看一看效果,在 main
方法中:
new Thread(r, "线程-A").start();//创建一个线程
new Thread(r, "线程-B").start();//创建一个线程
System.out.println(Thread.currentThread().getName());//打印当前线程的名称
在 run
方法中:
System.out.println(Thread.currentThread().getName());//打印当前线程的名称
主线程main的线程名称会先打印出来,因为当前线程正在 run ,而 A 和 B 只是 start 了,进入了 Runnable(可运行状态),当获取CPU资源的时候,才会 run(执行),至于先执行 A 还是先执行 B,是不确定的。