• [JAVA]JAVA实现多线程的三种方式


    1、继承Thread类,通过start()方法调用

    public class MultiThreadByExtends extends Thread {
        @Override
        public void run() {
            print("听歌");
        }
        public static void print(String threadName){
            while (true) {
                System.out.println("线程:"+threadName+" 输出。。。");
                try {
                    sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    
    
        public static void main(String[] args) {
            MultiThreadByExtends t1 = new MultiThreadByExtends();
            t1.start();
            print("写代码");
        }
    }

    输出结果:

    
    

    线程:写代码 输出。。。
    线程:听歌 输出。。。
    线程:写代码 输出。。。
    线程:听歌 输出。。。
    线程:写代码 输出。。。
    线程:听歌 输出。。。
    线程:听歌 输出。。。

     

    由于java单继承的特点,这种方式局限性很大,不能继承其他父类

    2、实现Runable接口

    public class MultiThreadByRunnable implements Runnable {
        @Override
        public void run() {
            print("听歌");
        }
        public static void print(String threadName){
            while (true) {
                System.out.println("线程:"+threadName+" 输出。。。");
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    
    
        public static void main(String[] args) {
            MultiThreadByRunnable tr1 = new MultiThreadByRunnable();
            //代理方式启动
            Thread thread = new Thread(tr1);
            thread.start();
            print("写代码");
        }
    }

    输出结果:

    线程:写代码 输出。。。
    线程:听歌 输出。。。
    线程:写代码 输出。。。
    线程:听歌 输出。。。
    线程:听歌 输出。。。
    线程:写代码 输出。。。
    线程:听歌 输出。。。
    线程:写代码 输出。。。

    3、实现callable接口

    import java.util.concurrent.*;
    
    public class CallableTest implements Callable<Boolean> {
        @Override
        public Boolean call() throws Exception {
            int count = 0;
            while (true){
                System.out.println("1111");
                Thread.sleep(1000);
                count++;
                if(count >10) {
                    break;
                }
            }
            return true;
        }
    
        public static void main(String[] args) throws ExecutionException, InterruptedException {
    
            CallableTest c = new CallableTest();
            ExecutorService es = Executors.newFixedThreadPool(1);
            Future<Boolean> res = es.submit(c);
            System.out.println(res.get());
            es.shutdownNow();
        }
    }

    该方式的优点是可以得到线程的返回值 

    平时开发中常用到的就是1、2两种方式,至于第三种,属于JUC里面的东西,如果在面试中能答上来,对初级或中级java面试来说绝对是加分项

  • 相关阅读:
    windows命令行下杀死进程的方法
    nodejs与javascript 笔记
    SQL Server 从一组数字中随机获取一个数
    SQL Server Default Trace查看是谁对数据库进行了DDL操作
    Default Trace 查找日志文件快速增长的原因
    使用Default Trace查看谁还原了你的数据库?
    SQL Server 默认跟踪(Default Trace)介绍使用
    (转载) SQL Server AG集群启动不起来的临时自救大招
    (转载) 搭建非域AlwaysOn win2016+SQL2016
    (转载) 从0开始搭建SQL Server AlwaysOn 第四篇(配置异地机房节点)
  • 原文地址:https://www.cnblogs.com/zhengxl5566/p/10332272.html
Copyright © 2020-2023  润新知