乐趣区

关于java:涨姿势了原来这才是Java多线程正确的实现方式网友亏大发了

今日分享开始啦,请大家多多指教~

明天给大家分享的是意识线程,创立线程和线程的罕用办法。

例程:实现字符迟缓输入

public class ThreadDemo1 {public static void main(String[] args) throws InterruptedException {
        String content = "他人说你不行,是因为他本人做不到。你要尽全力爱护你的幻想,那些讥笑你的人,他们必定会失败," +
                "他们想把你变成和他们一样的人。如果你有幻想的话,就要致力去实现,就这样。";
        for (char item : content.toCharArray()) {System.out.print(item);
            // 执行到此行休眠 200 毫秒
            Thread.sleep(200);
        }
    }
}



多线程的劣势 - 减少运行速度

能够察看上面这个多线程例程,体验多线程时如何减少运行速度的。



该代码运行后果如下:

可见,多线程的劣势,能够减少运行速度,缩短运行工夫的。

线程的创立形式,入手接触线程(三类六种)

第一类:继承 Thread 类来实现线程的创立(2 种创立形式)

第一类:继承 Thread 类创立办法 1

public class ThreadDemo3 {
    static class MyThread extends Thread {
        @Override
        public void run() {
            // 线程执行的工作
            System.out.println("线程名称:" +
                    Thread.currentThread().getName());
        }
    }
    public static void main(String[] args) {
        System.out.println("以后线程的名称(主线程):" +
                Thread.currentThread().getName());
        // 创立了线程
        Thread t1 = new MyThread();
        // 运行线程
        t1.start();}
}

该代码执行如下

第一类:继承 Thread 类创立办法 2

public class ThreadDemo4 {public static void main(String[] args) {
        System.out.println("以后线程的名称(主线程):" +
                Thread.currentThread().getName());
        Thread thread = new Thread() {
            @Override
            public void run() {
                // 线程执行的工作
                System.out.println("线程名称:" +
                        Thread.currentThread().getName());
            }
        };
        thread.start();}
}

该代码执行如下

第一类创立形式(继承 Thread 类的形式)毛病:

Java 语言的设计当中,只能实现单继承,如果该类继承了 Thread 类,也就无奈继承其余类。

第二类:实现 Runnable 接口的形式来实现线程的创立(3 种创立形式)

补救了第一类创立办法的毛病,即 Java 不能多继承,但能够实现多个接口

创立形式①:

该代码执行如下

创立形式②:应用匿名外部类的形式实现线程

public class ThreadDemo6 {public static void main(String[] args) {
        System.out.println("以后线程的名称(主线程):" +
                Thread.currentThread().getName());
        // 应用匿名外部类的形式实现线程
        Thread thread = new Thread(new Runnable() {
            @Override
            public void run() {
                System.out.println("线程名:" +
                        Thread.currentThread().getName());
            }
        });
        thread.start();}
}

该代码执行如下

创立形式③:lambda + 匿名 Runnable 的实现形式

public class ThreadDemo7 {public static void main(String[] args) {
        System.out.println("以后线程的名称(主线程):" +
                Thread.currentThread().getName());
        //JDK8 中的固定写法
        //lambda + 匿名 Runnable 的实现形式
        Thread thread = new Thread(() -> {
            System.out.println("线程名:" +
                    Thread.currentThread().getName());
        });
        thread.start();}
}

该代码执行如下

第三类:实现 Callable 接口的形式来实现线程的创立(1 种创立形式)

长处在于能够失去线程执行之后的后果。


该代码执行后果如下

线程休眠(实现形式有三种)

实现办法①长处:精确度很高。毛病:当休眠工夫过大时,代码书写较简单。

public class ThreadDemo9 {public static void main(String[] args) throws InterruptedException {System.out.println("开始工夫:" + new Date());
        // 休眠 1s
        Thread.sleep(1000);
        System.out.println("完结工夫:" + new Date());
    }
}

代码执行后果如下

当休眠较长时间,可用实现办法②和实现办法③。

实现办法②

该代码执行后果如下

实现办法③

public class ThreadDemo9 {public static void main(String[] args) throws InterruptedException {System.out.println("开始工夫:" + new Date());
        // 休眠 1s
        Thread.sleep(TimeUnit.SECONDS.toMillis(1));
        System.out.println("完结工夫:" + new Date());
    }

该代码执行后果如下

典型例题:应用两个线程来打印 ”AABBCCDD”。

解题思路:应用多线程 + 线程休眠即可实现题目要求

该代码执行后果如下

小结

过程是零碎分配资源的最小单位,线程是系统调度的最小单位。一个过程内的线程之间是能够共享资源的。每个过程至多有一个线程存在,即主线程。

今日份分享已完结,请大家多多包涵和指导!

退出移动版