多线程

作者: Deque | 来源:发表于2020-01-19 14:47 被阅读0次

    线程与进程

    • 线程是比进程更快的处理单元,而且所占用的资源也小,多线程的应用,也就是性能最高的应用(相比与进程而言)

    总结

    • 线程的存在离不开进程。进程如果消失后,线程一定消失。线程消失后进程未必消失。

    Java多线程实现

    • 掌握Java中三种多线程的实现方式(JDK1.5之后增加了第三种)

    如何实现:

    如果想在Java中实现多线程,有两种突击:

    • 继承Thread类:
    • 实现Runnable接口(Callable接口)

    继承Thread类

    Thread类是一个支持多线程的功能类,只要有一个子类他就可以实现多线程的支持

    /**
     * 这是一个多线程的操作类
     */
    class MyThread extends Thread{
        
    }
    

    Java中所有程序的“起点”是main()方法,但是在多线程也一定要有自己的起点,那么这个起点就是 run()也就是说,在多线程的每个主体类中都必须覆写Thread类提供的run()方法。

    • public void run(){}
      • 这个方法上没有返回值,那么也就是表示了线程一旦开始就要一直执行,不能够返回内容。

    举例:

    /**
     * 线程操作主类
     * 这是一个多线程的操作类
     */
    class MyThread extends Thread{
    
        private String name; /* 定义类中属性 */
        public  MyThread(String name){ /* 定义构造方法 */
            this.name = name;
        }
    
        /**
         * 重写/覆写run()方法,作为线程的主体操作方法
         */
        @Override
        public void run() {
            for (int i = 0; i < 200; i++) {
                System.out.println(this.name+" -> " + i);
            }
        }
    }
    

    本线程类的功能是进行循环的输出操作,所有的线程与进程是一样的,都必须轮流的去抢占系统资源。也就是说,如果直接调用了run()方法,并不能启动多现象,应该使用Thread类中的start()方法

    public class TestDemo {
    
        public static void main(String[] args) {
            MyThread m1 = new MyThread("线程A");
            MyThread m2 = new MyThread("线程B");
            MyThread m3 = new MyThread("线程C");
            
            m2.start();
            m1.start();
            m3.start();
        }
    }
    
    /**
     * 线程操作主类
     * 这是一个多线程的操作类
     */
    class MyThread extends Thread{
    
        private String name; /* 定义类中属性 */
        public  MyThread(String name){ /* 定义构造方法 */
            this.name = name;
        }
    
        /**
         * 重写/覆写run()方法,作为线程的主体操作方法
         */
        @Override
        public void run() {
            for (int i = 0; i < 200; i++) {
                System.out.println(this.name+" -> " + i);
            }
        }
    }
    

    此时发现执行结果为线程对象交替执行。


    执行结果

    疑问?为什么多线程的启动不是调用的run() 而必须调用start()?

    打开Java源码,我们来观察以下start()方法的定义

        public synchronized void start() {
    
            if (threadStatus != 0)
                throw new IllegalThreadStateException();
    
            group.add(this);
    
            boolean started = false;
            try {
                start0();
                started = true;
            } finally {
                try {
                    if (!started) {
                        group.threadStartFailed(this);
                    }
                } catch (Throwable ignore) {
                    /*  */
                }
            }
        }
    

    首先发现Thread类中start() 存在 IllegalThreadStateException异常抛出。

    相关文章

      网友评论

          本文标题:多线程

          本文链接:https://www.haomeiwen.com/subject/knyrzctx.html