多线程学习笔记2多线程基础

43次阅读

共计 1864 个字符,预计需要花费 5 分钟才能阅读完成。

一、如何创建多线程

1、继承 Thread 类

public class MyThread extends Thread {
    @Override
    public void run() {super.run();
        System.out.println("MyThread");
    }
}

public class Run {public static void main(String [] args){MyThread thread = new MyThread();
        thread.start();}
}

这里需要注意的是,run()方法里写的是线程执行的动作,而 start()是创建线程并运行。

2、实现 Runable 接口

public class MyRunnable implements Runnable{
    private int num;
    public MyRunnable(){num++;}
    @Override
    public void run(){System.out.println("It's the "+ num +" Thread");
    }
}

public class Run {public static void main(String [] args){MyRunnable runnable = new MyRunnable();
        Thread thread = new Thread(runnable);
        thread.start();
        System.out.println("运行结束");
    }
}

二、线程的状态

https://user-gold-cdn.xitu.io…

三、上下文切换

在一个核运行线程时,如果当前线程需要暂停转去运行其他线程,这个行为就叫做 上下文切换
但是某个线程暂停转去运行其他线程后,要恢复这个线程时,需要从上次暂停的地方继续执行,这就需要 CPU 记录一些数据来帮助恢复。(比如程序计数器,CPU 寄存器等等)
因此可以说,上下文切换就是 存储和恢复 CPU 状态的,能够使线程从断点继续执行。

四、Thread 常用方法

https://user-gold-cdn.xitu.io…

1、类方法

(1)sleep()方法

这个方法是让线程暂停(休眠)一段时间。

sleep(long millis)     // 参数为毫秒
sleep(long millis,int nanoseconds)    // 第一参数为毫秒,第二个参数为纳秒

调用了 sleep()方法,被休眠的线程会让出 CPU 给其他线程,但是需要注意的是,它不会让出锁 ,也就是说线程虽然休眠了,但是依旧保持本来有的锁。
另外,当休眠时间结束之后,并不一定会立即执行,因为此时可能还有其他线程在执行。

(2)yield()方法

yield()与 sleep()方法类似,同样让出 CPU,不让出对象锁。但是不同点在于,yield 不会传入参数,并且 调用 yield 后,线程会进入就绪状态 ,随时等待重新获得 CPU 时间片。而 调用 sleep 后,线程会进入阻塞状态

并且,yield 方法只允许和当前线程拥有相同优先级的线程获取 CPU。

2、对象方法

(1)isAlive()方法
判断当前线程是否活跃。活跃是指线程处于 就绪 或者 运行 的状态。

(2)join()方法
如果一个主线程启动了一个子线程,并且希望子线程执行完毕后再结束,那么就可以调用 join()方法,即 等待线程对象销毁

(3)setDaemon 和 isDaemon 方法
用来设置线程是否成为守护线程和判断线程是否是守护线程。
守护线程依赖于创建它的线程,随它的消亡而消亡。

https://user-gold-cdn.xitu.io…

3、其他方法

(1)线程的停止

停止线程一般有三种方法:
① 调用 stop() 函数 ,这个方法实际上已经废弃了,因为它会立即终止线程,并且会释放所有的锁,因此可能会造成不可预期的结果。
自定义一个变量,当这个变量发生改变时,提醒线程终止。
③ 使用 JDK 提供的interrupt 方法,提醒线程终止,但是否真正终止由线程自己决定。
(注意:线程在休眠时中断,会抛出异常,此时只能通过 interrupt 方法)

(2)wait 和 notify 方法

这两个方法是 Object 类的方法,也就是说对所有对象都可以调用。

调用了 wait 方法,线程就会停止执行,进入一个队列中,等待 notify 方法去唤醒,但是 notify 方法只会随机唤醒一个线程,而 notifyAll 可以唤醒所有线程。
需要注意的是wait 会释放锁,这是与 sleep 的不同之处。

参考:《实战 Java 高并发程序设计》
Java 多线程干货系列—(一)Java 多线程基础 https://juejin.im/post/5907bb…

正文完
 0