20240423-线程基础

创建线程的三种方法

继承Thread

java 复制代码
package com.ysf;

import java.util.concurrent.TimeUnit;

public class ThreadWay {

    public static void main(String[] args) throws InterruptedException {
        Hello t = new Hello();
        t.start();
        TimeUnit.SECONDS.sleep(3L);
    }

    static class Hello extends Thread{
        public void run(){
            System.out.println("hello");
        }
    }
}

实现Runnable

java 复制代码
package com.ysf;

import java.util.concurrent.TimeUnit;

public class RunableWay {

    public static void main(String[] args) throws InterruptedException {
        Thread thread = new Thread(new Test());
        thread.start();
        TimeUnit.SECONDS.sleep(10L);
    }

    static class Test implements Runnable{

        public void run() {
            System.out.println("hello");
        }
    }
}

实现Callable使用FutureTask

java 复制代码
package com.ysf;

import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask;

public class CallableWay {

    public static void main(String[] args) throws ExecutionException, InterruptedException {
        FutureTask<Integer> task = new FutureTask<>(new Tst());
        Thread thread = new Thread(task);
        thread.start();
        System.out.println(task.get());
    }

    static class Tst implements Callable<Integer>{

        public Integer call() throws Exception {
            int a = 0;
            for (int i=0;i<100;i++){
                a +=i;
            }
            return a;
        }
    }
}

线程的状态

NEW状态

java 复制代码
package com.ysf;

public class Tst01NEWState {

    public static void main(String[] args) {
        Thread t = new Thread(()->{});
        System.out.println(t.getState());
    }
}

RUNNABLE状态

java 复制代码
package com.ysf;

import java.util.concurrent.TimeUnit;

public class Tst02RUNNABLEState {

    public static void main(String[] args) throws InterruptedException {
        Thread t = new Thread(()->{
            while (true){}
        });
        t.start();
        TimeUnit.SECONDS.sleep(20L);
        System.out.println(t.getState());
    }
}

BLOCKED状态

java 复制代码
package com.ysf;

import java.util.concurrent.TimeUnit;

public class Tst03BLOCKState {

    public static void main(String[] args) throws InterruptedException {
        Thread t = new Thread(()->{
            // t线程在获取锁的时候阻塞,因为锁已经被主线程拿走了
           synchronized (Tst03BLOCKState.class){

           }
        });

        // 主线程拿锁后启动t线程
        synchronized (Tst03BLOCKState.class){
            t.start();
            TimeUnit.SECONDS.sleep(2L);
            System.out.println(t.getState());
        }
    }
}

WAITING状态

  • wait状态必须手动唤醒
java 复制代码
package com.ysf;

import java.util.concurrent.TimeUnit;

public class Tst04WaitState {

    public static void main(String[] args) throws InterruptedException {
        Object obj = new Object();
        Thread t = new Thread(()->{
            synchronized (obj){
                try {
                    // 调用wait方法等待,wait方法一定要手动唤醒
                    obj.wait();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        });
        
        t.start();
        TimeUnit.SECONDS.sleep(2L);
        System.out.println(t.getState());
    }
}

TIMED_WAITING

  • 调用sleep或join方法
java 复制代码
package com.ysf;

import java.util.concurrent.TimeUnit;

public class Tst05TimedWaiting {

    public static void main(String[] args) throws InterruptedException {
        Thread t = new Thread(()->{
            try {
                // t休眠1秒
                TimeUnit.SECONDS.sleep(1);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        });
        t.start();
        // 主线程休眠0.5秒
        TimeUnit.MILLISECONDS.sleep(500L);
        // 此时t应仍在休眠,因此getState方法应为TIMED_WAITING状态
        System.out.println(t.getState());
    }
}

TERMINATED状态

java 复制代码
package com.ysf;

import java.util.concurrent.TimeUnit;

public class Tst06Terminated {

    public static void main(String[] args) throws InterruptedException {
        Thread t = new Thread(()->{
            try {
                // t休眠0.5秒
                TimeUnit.MILLISECONDS.sleep(500);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        });
        t.start();
        // 主线程休眠1秒
        TimeUnit.MILLISECONDS.sleep(1000L);
        // 此时t应执行结束了,因此getState方法应为TERMINATED状态
        System.out.println(t.getState());
    }
}

线程的常用方法

获取当前线程

java 复制代码
package com.ysf;

public class Tst07CurrentThread {

    public static void main(String[] args) {
        Thread main = Thread.currentThread();
        // 获取并打印当前线程
        // 输出结果:Thread[main,5,main]
        // 线程名,优先级,组名
        System.out.println(main);
    }
}
相关推荐
weixin1997010801611 小时前
安家 GO item_area - 获取地区类列表数据接口对接全攻略:从入门到精通
java·数据库·golang
码出财富11 小时前
60万QPS下如何设计未读数系统
java·spring boot·spring cloud·java-ee
05大叔11 小时前
大事件Day04
java·开发语言
高山上有一只小老虎11 小时前
解决springboot项目从mybatis切换为集成jpa后dao层方法检查爆红
java·spring boot
D_FW11 小时前
【Java】Redis五大核心数据结构底层原理解析
java·数据结构·redis
有一个好名字11 小时前
【无标题】
java·开发语言·jvm
0和1的舞者11 小时前
SpringBoot 接口规范:统一返回、异常处理与拦截器详解
java·spring boot·后端·spring·知识·统一
一 乐11 小时前
动漫交流与推荐平台|基于springboot + vue动漫交流与推荐平台系统(源码+数据库+文档)
java·前端·数据库·vue.js·spring boot·后端
漉水浮沙11 小时前
Fio crc 数据校验验证
java·服务器·前端·数据库
期待のcode11 小时前
Java虚拟机的垃圾对象判定
java·开发语言·jvm