并发编程-Java线程

127 阅读2分钟

一. 本章内容

  • 创建&运行线程
  • 查看线程
  • 线程API
  • 线程状态

1.1 创建&运行线程

一共有3种方式, 分别是:

  1. 继承Thread类, 并重写run方法
  2. 实现Runnable接口, 配合Thread
  3. FutureTask配合Thread

1.1.1 方式一: 继承Thread类, 并重写run方法

/**
 * 方式一: Thread匿名内部类方法
 */
public static void create_01(){
    //1.创建线程对象(以"t1"命名线程名称)
    Thread t1 = new Thread("t1"){
        @Override
        public void run() {
            log.debug("running");
        }
    };

    //2.启动线程(交给任务调度器, 分配时间片, 交给cpu去执行)
    t1.start();
    log.debug("running");
}

1.1.2 方式二: 实现Runnable接口, 配合Thread

/**
 * 方式二: Runnable接口 + Thread
 * @desc: 把任务和线程分开 (建议)
 */
public static void create_02(){

    //创建任务对象
    Runnable runnable = new Runnable() {
        @Override
        public void run() {
            //要执行的任务
            log.debug("running");
        }
    };

    //创建线程对象
    Thread t2 = new Thread(runnable, "t2");

    //启动线程
    t2.start();
    log.debug("running");
}

1.1.2.1 lambda简化方式

    /**
     * 方式三: lambda简化版
     */
    public static void create_03(){
        //任务对象
        Runnable runnable = () -> log.debug("running");

        //创建线程对象
//        Thread t3 = new Thread(runnable, "t3");
        //创建线程对象_熟练版
        Thread t3 = new Thread(() -> log.debug("running"), "t3");

        //启动线程
        t3.start();
        log.debug("running");
    }

1.1.3 方式三: FutureTask配合Thread

  1. 定义一个未来线程的任务实现callback接口, 申明线程执行结果类型;
  2. 重写callback接口的call方法;
  3. 构造Thread线程对象;
  4. 调用线程的start()方法, 启动线程
/**
 * 方式三: futureTask
 * @throws ExecutionException
 * @throws InterruptedException
 */
public static void create_04() throws ExecutionException, InterruptedException {
    //创建未来线程任务
    FutureTask<Integer> futureTask = new FutureTask<Integer>(new Callable<Integer>() {
        @Override
        public Integer call() throws Exception {
            log.debug("running");
            Thread.sleep(2000);
            return 100;
        }
    });
    
    Thread t = new Thread(futureTask, "t1");
    t.start();
    //主线程阻塞,同步等待 task 执行完毕的结果
    log.debug("{}", futureTask.get());
}

1.2 观察多个线程同时运行

/**  
* 线程运行_多个线程同时运行的现象  
* @Author: Nisy  
* @Date: 2023/05/12/12:49  
*/  
@Slf4j(topic = "c.MultiThreadTest")  
public class MultiThreadTest {  
  
public static void main(String[] args) {  
  
    new Thread(() -> {  
        while (true){  
            log.debug("running");  
        }  
    }, "t1").start();  
  
    new Thread(() -> {  
        while (true){  
            log.debug("running");  
        }  
    }, "t2").start();  
  }  
}

执行结果:

image.png

结论:

  • t1和t2线程是交替执行的
  • t1和t2谁先先后, 我们控制不了, 是由底层的任务调度器来控制的

1.3 查看进程线程的方法

1.3.1 windows

  1. 任务管理器可以查看进程和线程数, 也可以杀死进程
  2. tasklist命令查看进程
  3. taskkill命令杀死进程

1.3.2 linux

  1. ps -ef命令查看所有进程
  2. ps -ft -p <PID>命令查看某个进程(PID)的所有线程
  3. kill命令杀死进程