Java多线程

时间:2024-10-17 07:05:14

同一个进程的线程之间,共用了同一份资源
在这里插入图片描述
将上述代码该为while(true)

package thread;
//创建一个类,继承来自Thread
class MyThread extends Thread{
    public void run(){
        //这个方法就是线程的入口方法
        while (true){
            System.out.println("hello thread");
        }
    }
}
public class Demo1 {
    public static void main(String[] args) {
        Thread t=new MyThread();
        //start和run都Thread的成员
        //run只是描述了线程的入口(线程要做什么任务)
        //start择时真正调用了系统API,在系统中创建出线程,让线程再调用run
        t.start();
        while (true){
            System.out.println("hello main");
        }
    }
}

可以看到,这两个while循环在 ”同时执行“ ,看到的结果是,两边的日志都在交替打印

说明:每个线程都是一个独立执行的逻辑(独立执行流)

把 t.start 改成 t.run ,此时,代码中不会创建出新的线程,只有一个主线程。
这个主线程里面只能依次执行循环,执行完一个循环再执行另一个。
因为 t.run 里有一个循环,这个循环没有结束,所有一直无法执行到 ”hello main“ 这个循环了

此时的运行结果就只有 ”hello thread“

循环太快,希望慢一点,在循环体里加上sleep
sleep方法可能会抛出一个异常,这个异常时受查异常,必须时显式处理,此处必须try catch,不能 throws,在这个代码中是重写父类的 run,父类的 run 没有throws,子类方法也不能有throws
在这里插入图片描述
在这里插入图片描述

但是在mian方法里由于是自己定义的,所有可以throws

package thread;
//创建一个类,继承来自Thread
class MyThread extends Thread{
    public void run(){
        //这个方法就是线程的入口方法
        while (true){
            System.out.println("hello thread");
            try{
                Thread.sleep(1000);
            }
            catch (InterruptedException e){
                e.printStackTrace();
            }
        }
    }
}
public class Demo1 {
    public static void main(String[] args) throws InterruptedException{
        Thread t=new MyThread();
        //start和run都Thread的成员
        //run只是描述了线程的入口(线程要做什么任务)
        //start择时真正调用了系统API,在系统中创建出线程,让线程再调用run
        t.start();
        //t.run();
        while (true){
            System.out.println("hello main");
            Thread.sleep(1000);
        }
    }
}

在这里插入图片描述
运行结果如图,每秒钟打印出来的内容,顺序是不确定的,这两个线程都是休眠1000ms,当时间到了之后,这俩线程谁先执行谁后执行不一定,这个过程可以视为”随机“的

快捷键:ctrl+alt+t
ctrl+1

Thread类的其它写法:

继承Thread,重写run

实现Runnable,重写run

表示一个“可以运行的任务”,这个任务是交给线程负责执行,还是交给其它的实体来执行,Runnable本身并不关心
通过这个操作,调用系统api来完成创建线程的工作

class MyRunnable implements Runnable{
    @Override
    public void run() {
         while(true){
             System.out.println("hello thread");
             try {
                 Thread.sleep(1000);
             } catch (InterruptedException e) {
                 e.printStackTrace();
             }
         }
    }
}
public class Demo1{
    public static void main(String[] args) {
        Runnable runnable=new MyRunnable();
        Thread t=new Thread(runnable);
        t.start();
        while(true){
            System.out.println("hello main");
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}