zl程序教程

您现在的位置是:首页 >  后端

当前栏目

java多线程小题一瞥

2023-09-14 09:06:28 时间

有如下线程类定义:

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多线程相关知识:

线程与进程

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方法的区别:
  • start用来创建新线程来异步执行子任务
  • run只是一个普通的方法,调用run不会新建线程