public class demo1 {
public static void main(String[] args) {
Thread thread = new MyThread();
thread.start();
while (true){
System.out.println("正在执行主线程");
}
}
}
class MyThread extends Thread{
@Override
public void run() {
while (true){
System.out.println("正在执行 run 线程");
}
}
}
运行结果:
以上代码和运行结果都是多线程所展示的,接下来对比一下单线程代码和运行结果:
java复制代码
public class demo1 {
public static void main(String[] args) {
Thread thread = new MyThread();
thread.run();
while (true){
System.out.println("正在执行主线程");
}
}
}
class MyThread extends Thread{
@Override
public void run() {
while (true){
System.out.println("正在执行 run 线程");
}
}
}
注意观察,这里没有用到 start 方法,那么就意味着没有创建新的线程当前是主线程。因为没有创建新的线程,所以就不会有系统自动调用重写的 run 方法,那么我们自己手动调用 run 方法也是可以的,不过还是在同一个线程里面,并没有创建新的线程。因此,这里只能输出 "正在执行 run 线程" 这条语句,只能等到这循环结束后,才会执行下一个循环,因为在同一个线程里面,不能多并行。
1)start 方法调用操作系统提供的"创建线程"的 API ,在内核中创建对应 PCB ,并且把 PCB 加入到链表中。run 方法则是在进一步的系统调度到这个线程了之后,系统自动就会执行上诉 run 方法中的逻辑。
2)多线程的调度顺序是无序的,在操作系统内部也称为"抢占式执行"。任何一个线程,在执行到任何一个代码的过程中,都可以被其他线程抢占掉它的 cpu 资源,于是 cup 就给别的线程执行了。这样的抢占式执行,充满了随机性,正是这样的随机性,使多线程的程序,执行效果,也会难以预测,甚至可以会引入 bug 。
除了以上的写法之外,还有用匿名内部类形式。
代码如下:
java复制代码
public class demo2 {
public static void main(String[] args) {
Thread thread = new Thread(){
@Override
public void run() {
while(true){
System.out.println("正在运行 run 方法");
}
}
};
thread.start();
while (true){
System.out.println("正在运行 main 方法");
}
}
}
还可以用 lambda 方式进行进一步的简化:
java复制代码
public class demo2 {
public static void main(String[] args) {
Thread thread = new Thread(() -> {
while (true){
System.out.println("正在运行 run 方法");
}
});
thread.start();
while (true){
System.out.println("正在运行 main 方法");
}
}
}
4.2 实现多线程方法 - 实现 Runnable 接口
为了提高代码的灵活性,可以将线程的任务与线程本身分离,使代码结构更清晰。
先实现 Runnable 接口,一样的需要重写 run 方法,再把这个实例作为参数传入到创建 Thread 类中。最后调用 start 方法启动线程。
代码如下:
java复制代码
public class demo3 {
public static void main(String[] args) {
Thread thread = new Thread(new MyRunnable());
thread.start();
while (true){
System.out.println("正在运行 main 方法");
}
}
}
class MyRunnable implements Runnable{
@Override
public void run() {
while (true){
System.out.println("正在运行 run 方法");
}
}
}
同样也可以用匿名类内部类方式:
java复制代码
public class demo4 {
public static void main(String[] args) {
Thread thread = new Thread(()-> {
while(true) {
System.out.println("正在运行 run 方法");
}
});
thread.start();
while (true){
System.out.println("正在运行 main 方法");
}
}
}