栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Java多线程编程核心技术(第三版)

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Java多线程编程核心技术(第三版)

1.进程|线程

进程是系统分配和管理的资源的基本单位。

进程就是在系统中运行的程序或者任务,比如在任务管理器中,你看到的每一个正在运行的exe程序就可以理解成
一个进程。

--------------------------------
在IDE中运行*.class文件相当于在操作系统中启动一个JVM虚拟机进程,在该虚拟机进程加载*.class文件并运
行。

--------------------------------
线程是在进程中独立运行的子任务。


进程和线程总结:
1.进程虽然是相互独立的,但它们可以互相通信,通用的方式是使用Socket或HTTP协议。
2.进程拥有共享的系统资源,比如内存、网络端口、供其内部线程使用。
3.进程较重、因为创建进程需要操作系统分配资源,会占用内存。
4.线程存在于进程中,是进程的一个子集,先有进程、后有线程。
5.虽然线程更轻,但线程上下文切换的时间成本非常高。

2.使用多线程的优点

充分利用CPU的空闲时间来处理其他任务,由于任务的切换速度很快,给使用者的感受就是这些任务同时运行,所
以使用多线程技术可以在同一时间内做更多不同种类的任务。


---------------------------------
补充:
1.单任务的特点就是排队执行,也就是同步。在同一时间只能执行一个任务,CPU利用率大幅降低,这就是单任务环境的缺点。
2.多任务的特点是在同一时间内可以执行多个任务,使用多线程就是在使用异步。

3.在什么场景使用多线程

1.阻塞:系统中出现了阻塞现象,则可以根据实际情况来使用多线程提高运行效率。
2.依赖:业务A阻塞时,业务B不依赖业务A的执行结果时,可以用多线程提高运行效率。

4.继承Thread类

Java的JDK开发包自带了对多线程技术的支持,可以方便地进行多线程编程。实现多线程编程的方式主要有两种:
一种是继承Thread类,另外一种是实现Runnable接口。这两种方式创建线程的功能都是一样的,没有本质的区
别。只不过继承的局限就是单继承,实现可以多实现。
public class ThreadTest {
    public static void main(String[] args) {

        MyThread myThread = new MyThread();
        myThread.start();
        System.out.println("运行结束!");
    }
}
------------------------------------
public class MyThread extends Thread{

    @Override
    public void run() {
        System.out.println("MyThread");
    }
}
------------------------------------
输出:
运行结束!
MyThread

Process finished with exit code 0

代码使用start()方法来启动一个线程,线程启动后会自动调用线程对象中的run()方法,run()方法里面的代码
就是线程对象要执行的任务,是线程执行任务的入口。

注意:
使用多线程技术时,代码的运行结果与代码执行顺序或调用顺序无关。因为线程是一个子任务,CPU是以不确定的
方式,或者随机的时间来调用线程中的run()方法,所以先输出"运行结束!"和先输出"MyThread"具有不确定性。

5.常见的3个命令分析线程的信息

如果想要查看线程的状态与信息,则可采用3种常见的命令,分别是jsp+jstack.exe、jms.exe和jvisualvm.exe
它们在jdkbin文件夹中。
1.jps+jstack.exe命令,在cmd中输入jps命令查看Java进程,然后使用jstack命令查看该进程下线程的状态:

C:Program FilesJavajdk1.8.0_201bin>jps  --直接回车 便可以查询进程对应的PID
7088 Launcher
7712 ThreadTest2
4276 Jps
7096
11564 RemoteMavenServer36

C:Program FilesJavajdk1.8.0_201bin>jstack -l 7712  --回车就可以看到线程的状态
2.使用jmc.exe命令
在jdk/bin中双击jmc.exe命令

注意:如果在jmc.exe中看不到JVM进程,说明jmc.exe和IDE中使用的JDK版本不一致。
3.使用jvisualvm.exe命令,双击jvisualvm.exe命令。

6.执行start()的顺序不代表执行run()的顺序

执行start()方法的顺序不代表线程启动的顺序,不代表run()方法执行顺序,执行run()是随机的。



public class ThreadTest3 extends Thread {

    private int i = 0;

    public ThreadTest3(int i) {
        this.i = i;
    }

    @Override
    public void run() {
        System.out.println(Thread.currentThread().getName() + "---->i" + i);
    }
}



public class ThreadTest {
    public static void main(String[] args) {

        ThreadTest3 t1 = new ThreadTest3(1);
        ThreadTest3 t2 = new ThreadTest3(2);
        ThreadTest3 t3 = new ThreadTest3(3);
        ThreadTest3 t4 = new ThreadTest3(4);
        ThreadTest3 t5 = new ThreadTest3(5);

        t1.start();
        t2.start();
        t3.start();
        t4.start();
        t5.start();
    }
}

-------------------------------------------
Thread-2---->i3
Thread-3---->i4
Thread-1---->i2
Thread-4---->i5
Thread-0---->i1

Process finished with exit code 0

7.

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/1006188.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号