Loading...
墨滴

谭羽

2021/11/10  阅读:15  主题:默认主题

线程基础以及实现

类型 接受参数 返回结果 支持异步
Supply ×
Apply
Accept ×
Run × ×

线程简介

程序

线程(Thread)

进程(Process)

线程实现

线程的三种创建方式

继承Thread类

public class ThreadOne extends Thread{
    @Override
    public void run() {
        System.out.println("创建线程方法一!");
    }

    public static void main(String[] args) {

        /**
         * 写法一
         */
        for (int i = 0; i < 100; i++) {
            ThreadOne threadOne=new ThreadOne();
            threadOne.start();
        }



        /**
         * 写法二(lambda)
         */
        Thread threadOne=new Thread(()-> System.out.println("创建线程方法一!"));
        threadOne.start();
    }
}

实现Runnable接口

public class ThreadTwo implements Runnable{

    private String s;

    public ThreadTwo(String s) {
        this.s = s;
    }

    @Override
    public void run() {
        System.out.println(s);
    }



    public static void main(String[] args) {
        for (int i = 0; i < 100; i++) {
            Thread threadTwo=new Thread(new ThreadTwo(i+""));
            threadTwo.start();
        }
    }

}

实现Callable

public class ThreadThree implements Callable<String> {
    private String s;

    public ThreadThree(String s) {
        this.s = s;
    }

    @Override
    public String call() throws Exception {
        System.out.println(s);
        return s;
    }

    public static void main(String[] args) throws Exception {



        ThreadThree threadThreeA = new ThreadThree("1");
        ThreadThree threadThreeB = new ThreadThree("2");
        ThreadThree threadThreeC = new ThreadThree("3");
        ThreadThree threadThreeD = new ThreadThree("4");
        
        String a = threadThreeA.call();
        String b = threadThreeB.call();
        String c = threadThreeC.call();
        String d = threadThreeD.call();
    }

}

注意:

1、建议使用实现Runnable

在面向对象设计中,有一条约定俗成的规则,组合优于继承(Prefer composition over inheritance),继承只能单继承,但是接口可以多实现。

线程状态

线程的状态

NEW

RUNNABLE

BLOCKED

WAITING

TIMED_WAITING

TERMINATED

图片
图片
图片
图片

新生 就绪 启动 阻塞 死亡

线程停止 stop

线程休眠 sleep

sleep后线程进入就绪状态,sleep不会释放对象的锁、

线程礼让 yield

让正在执行的线程暂停但是不阻塞,线程从运行状态转换为就绪状态,但是线程运行由cpu调度,礼让不一定成功

线程合并 join

join合并线程,待此线程执行完成后,在执行其他线程,执行过程中,其他线程阻塞(类似于插队操作)

线程的优先级

java提供一个线程调度器来监控程序中启动后进入就绪状态的所有线程,线程调度器按照优先级顺序决定应该调度哪一个线程执行

优先级用数字表示 1-10

优先级低只是意味着被调度的可能性低,并不意味着不被执行,由cpu的调度决定(性能倒置)

守护(daemon)线程

线程分为用户线程和守护线程

虚拟机必须保护用户线程执行完毕

虚拟机不用等待守护线程执行完毕

线程同步

多个线程操作同一个线程

并发:同一个对象被多个线程同时操作

队列和锁

死锁:多个线程互相抱着对方需要的资源,形成死锁

线程通信

谭羽

2021/11/10  阅读:15  主题:默认主题

作者介绍

谭羽