• Java创建线程的方式


    Java创建线程的方式

    方式一: 继承Thread类,重写run()方法

    public class Test_Thread {
        public static void main(String[] args) {
            new Thread_Demo().start();
            new Thread_Demo().start();
            new Thread_Demo().start();
        }
    }
    
    /**
     * 创建线程的方式一:
     * 继承 Thread 类,并重写 run() 方法
     */
    class Thread_Demo extends Thread{
        @Override
        public void run() {
            for(int i = 0;i<5;i++){
                System.out.println(Thread.currentThread().getName() + ", i = " + i);
            }
        }
    }
    

    方式二: 实现Runnable接口

    import java.util.concurrent.TimeUnit;
    
    public class Test_Runnable {
    
        public static void main(String[] args) {
            // 写法一,new一个Runnable的实现类对象作为构造入参
            new Thread(new Runnable_Demo()).start();
            new Thread(new Runnable_Demo()).start();
            new Thread(new Runnable_Demo()).start();
    
            try {
                // 休眠1秒
                TimeUnit.SECONDS.sleep(1);
    
                // 写法二, 函数式编程
                new Thread(()->{
                    for(int i = 0;i<5;i++){
                        System.out.println(Thread.currentThread().getName() + ", i = " + i);
                    }
                }).start();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
    
        }
    }
    
    /**
     * 方式二:实现接口Runnable
     * 作为Thread的构造入参来启动
     */
    class Runnable_Demo implements Runnable{
        @Override
        public void run() {
            for(int i = 0;i<5;i++){
                System.out.println(Thread.currentThread().getName() + ", i = " + i);
            }
        }
    }
    

    方式三: Callable与Future结合

    在方式一与方式二中都无法直接获得线程的返回结果,只能通过共享变量等方法;使用Callable和Future方法可以获取到线程的执行结果。

    import java.util.Random;
    import java.util.concurrent.*;
    
    public class Test_Callable {
    
        public static void main(String[] args) throws ExecutionException, InterruptedException {
    
            // 普通写法
            ExecutorService executorService = Executors.newFixedThreadPool(1);
            Future<Integer> submit = executorService.submit(new Callable_Demo());
            Integer result = submit.get();
            System.out.println("result is " + result);
    
            // 函数式编程
            Integer futureRes = executorService.submit(()->{
                int res = new Random().nextInt();
                System.out.println("Random is " + res + ", call method2 is running... ");
                return res;
            }).get();
            System.out.println("futureRes is " + futureRes);
            
            // 关闭服务
            executorService.shutdown();
            // 关闭服务后不能再新增线程到线程池中,下面代码在运行中会报错
            executorService.submit(()->{
                System.out.println("1245");
            });
            
        }
    
    }
    
    /**
     * 方式三 实现Callable接口,可以获取线程的执行结果
     * 需要结合Future和Executor*来实现
     */
    class Callable_Demo implements Callable<Integer> {
    
        @Override
        public Integer call() throws Exception {
            int result = new Random().nextInt();
            System.out.println("Random is " + result + ", call method is running... ");
            return result;
        }
    }
    
  • 相关阅读:
    让我用69406条评论告诉你“反贪风暴”好不好看!!!
    【大数据】爬取全部的校园新闻
    【大数据】获取一篇新闻的全部信息
    【大数据】理解爬虫原理
    中文统计
    [大数据]统计词频
    数据库表设计以及表字段命名
    设计模式的理论理解
    文件上传之oss服务器上传文件简笔
    QueryWrapper/UpdateWrapper认识
  • 原文地址:https://www.cnblogs.com/lfdingye/p/14749138.html
Copyright © 2020-2023  润新知