• 《java多线程编程核心技术》(一)使用多线程


    了解多线程
    进程和多线程的概念和线程的优点:

    提及多线程技术,不得不提及"进程"这个概念。百度百科对"进程"的解释如下:
    进程(Process)是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础。

    看起来可能比较抽象,如果我们打开任务管理器,那么"进程"就可以看成下面在操作系统中运行的exe程序。
    enter description here
    所以进程是受操作系统管理的基本运行单元!

    那什么是线程呢?

    线程可以理解为在进程中独立运行的子任务。比如我们的QQ.exe运行时就有很多的子任务在同时运行,好友 视频线程、下载文件线程、发送表情线程。这些不同的任务或功能都能同时运行,每一项任务都可以理解为线程在工作。

    那么这么使用多线程有什么优点呢?

    多数人使用的都是“多任务操作系统”,那比如windows,那么其中的方便性大家应该都深有体会。使用多任务操作系统,可以最大限度的利用CPU的空闲时间来处理其他的任务,比如一边听音乐,一边编辑文档。CPU在这些任务之间不停的切换,由于切换的速度非常之快,给使用者的感觉这些任务似乎在同时运行。所以使用多线程技术后,可以在同一时间内运行更多不同种类的任务,提高CPU的使用率。

    创建线程:

    想学习一个技术我们必须使用它,现在先通过一个示例接触一下线程。

    一个进程正在运行至少会有一个线程在运行,比如java中我们调用的public static void main()方法的创建的线程就是这样的,而且它是由JVM创建的。

    public class MyFirstThread {
        public static void main(String args[]){
            System.out.println(Thread.currentThread().getName());
        }
    }

    程序运行后结果:

     

    enter description here
     

    控制台会输出一个名称为main的线程,正在执行main()方法的代码。

    如何使用多线程?
    在java的JDK开发包中,自带了对多线程的支持,可以方便的进行多线程编程。实现多线程编程的主要方式有两种。
    一种是继续Thread类,另一种是实现Runnable接口。
    在创建新的线程前,先别急,看一下Thread类的结构:

    public class Thread implements Runnable

    发现了吧,Thread实现了Runnable的接口,他们之间具有多态关系。
    使用Thread类的方式创建新线程,最大的局限就是不支持多继承,因为java不支持多继承嘛。所以为了支持多继承,完全可以使用实现Runnable接口的方式。
    总结一下,用这两种方式创建的线程在工作时性质时一样的,没有本质区别。

    那么接下来先看第一种方法,需要继承Thread类并重写run方法:

    继承Thread类

    package MyThread;
    
    public class Test01 {
        public static void main(String args[]){
            MyThread myThread=new MyThread();
            myThread.start();
            System.out.println("运行结束");
        }
    }
    

    运行结果如下:
    enter description here

    可以看到,MyThread中的run()方法运行较晚,所以在多线程技术里,代码的运行结果和代码的调用顺序是无关的。
    线程是一个子任务,CPU以不确定的方式,或者说随机的方式来调用线程。所以出现了上面的情况,千万不要把代码顺序当成线程的执行的顺序!

    实现Runnable接口
    当要创建的线程类已经有父类的情况下,就无法再继承Thread类了,所以需要通过实现Runnable接口来应对这种情况。
    那么我们就先创建一个实现了Runnable接口类如下:

    package MyThread;
    
    public class Myrunnable implements Runnable {
        @Override
        public void run(){
            System.out.println("我是实现Runnable接口的线程");
        }
    }

    至于怎么使用这个MyRunnable类 我们就需要根据Thread.java的构造函数。

        public Thread(Runnable target) {
            init(null, target, "Thread-" + nextThreadNum(), 0);
        }
           public Thread(Runnable target, String name) {
            init(null, target, name, 0);
        }

    其中有两个构造函数可以传递Runnable接口,说明构造函数支持传入Runnable接口对象。我们的测试类代码如下:

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

    结果如下:
    enter description here

    第一节的内容主要是去了解多线程和基本的创建线程的两种方法。

    参考书籍《Java多线程编程核心技术》

  • 相关阅读:
    Linux文件系统之INode
    手写Netty之多路复用Select小案例
    多路复用器Select、Poll、Epoll区别梳理
    NAT模式、路由模式、桥接模式的区别
    Netty编解码器(理论部分)
    Netty之Unpooled_Bytebuf
    为什么 TCP 协议有粘包问题
    IDEA_2019.1版本中Protobuf的使用
    Netty服务端Server代码说明
    Netty之ChannelHandler
  • 原文地址:https://www.cnblogs.com/fankailei/p/10607130.html
Copyright © 2020-2023  润新知