java多线程小题一瞥

时间:2023-03-08 20:18:36

有如下线程类定义:

public class MyThread extends Thread {

    private static int num = 0;

    public MyThread() {
num++;
} @Override
public void run() {
System.out.println("主动创建的第" + num + "个线程" + currentThread().getName());
} }

看如下方法的执行结果:

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

        for (int i = 1; i <= 10; i++) {
MyThread th = new MyThread();
th.setName("thread_" + i);
th.start();
} }

下面是结果:

主动创建的第10个线程thread_1
主动创建的第10个线程thread_3
主动创建的第10个线程thread_2
主动创建的第10个线程thread_5
主动创建的第10个线程thread_7
主动创建的第10个线程thread_9
主动创建的第10个线程thread_6
主动创建的第10个线程thread_8
主动创建的第10个线程thread_4
主动创建的第10个线程thread_10

打印出来的num都是10,也许会出乎我们的意料。释义:Thread类的start()方法用来创建一个新线程来执行子任务, new MyThread()语句是在主线程执行的, 所以,自然是num会递增,直到loop结束,值为10。

那么,改造一下main方法逻辑, 在循环里每个th.start()后面加上一句Thread.sleep,结果会有所不同。如果设定sleep的毫秒数比较大,那么会按我们期望的num递增来输出结果。这个值取决于主机的处理能力,如果太小,比如1ms,可能也会打印出重复的num。 释义:一个进程在运行态时调用sleep(),进入等待态,这时其他子线程开始执行。sleep详解可参见https://www.cnblogs.com/guodongli/archive/2011/04/07/2007721.html

▍|▍▍||▍| ▍|▍▍||▍| ▍|▍▍||▍|▍▍||▍| ▍|▍▍||▍| ▍|▍▍||▍|▍▍||▍| ▍|▍▍||▍| ▍|▍▍||▍|▍▍||▍| ▍|▍▍||▍| ▍|▍▍||

java多线程小题一瞥

附java多线程相关知识:

线程与进程

1 线程:进程中负责程序执行的执行单元
线程本身依靠程序进行运行
线程是程序中的顺序控制流,只能使用分配给程序的资源和环境
2 进程:执行中的程序
一个进程至少包含一个线程
3 单线程:程序中只存在一个线程,实际上主方法就是一个主线程
4 多线程:在一个程序中运行多个任务
目的是更好地使用CPU资源

在java中,有2种方式来创建线程执行子任务:
  1. 直接继承Thread类,调用start方法
  2. 实现Runnable接口来定义一个子任务,然后交由Thread去执行

Thread和Runnable的区别:
Runnable的中文意思是“任务”,顾名思义,通过实现Runnable接口可以定义一个子任务,然后将子任务交给Thread去执行。
Thread类实现了Runnable接口
Thread的start方法:创建一个新线程来执行子任务。
new Thread(new Runnable() {
public void run() {
... ...
}
}).start();

start方法和run方法的区别:
  • java多线程小题一瞥start用来创建新线程来异步执行子任务
  • java多线程小题一瞥run只是一个普通的方法,调用run不会新建线程