zoukankan      html  css  js  c++  java
  • 如何创建多线程

    线程的状态

    初始化—就绪—运行—终止

    Sleep : 超时等待,过了一段时间就会进入就绪状态进行竞争cpu资源。

    Wait: 等待状态,没有通过notify 或者 notifyAll 唤醒,就会一直进行等待。

    Block: block io 或者 遇到加锁的代码时, 接受到数据或者获取到锁就会到运行状态,也有可能直接进入dead 状态。

      public class NewThread implements Runnable {
    
        @Override
        public synchronized void run() {
            while (true) {
                System.out.println("线程运行了...");
                try {
    //                Thread.sleep(100);
                    wait();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    
        public static void main(String[] args) {
            //创建线程并执行线程任务
            NewThread target = new NewThread();
            Thread thread = new Thread(target);
            //线程启动
            thread.start();
    
            while (true) {
                synchronized (target) {
                    System.out.println("主线程");
                    try {
                        Thread.sleep(100);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    target.notify();
                }
            }
        }
    }
    

    创建线程的多种方式

    继承Thread类

    创建线程:

    public class Demo1 extends Thread {
    
        public Demo1(String name) {
            super(name);
        }
    
    
        @Override
        public void run() {
            while (true) {
                System.out.println(getName() + "线程执行...");
            }
        }
    
        public static void main(String[] args) {
            Demo1 d1 = new Demo1("first-thread");
            Demo1 d2 = new Demo1("second-thread");
    
            //(守护线程) 即使线程没有执行完毕,只要主线程执行完了,线程就会退出
            d1.setDaemon(true);
            d2.setDaemon(true);
            d1.start();
            d2.start();
            try {
                Thread.sleep(2000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
    
        }
    }
    

    线程的中断:

    使用stop()方式没有释放锁和资源,只是让线程无限期的等待下去
    推荐使用interrupt()

    public class Demo1 extends Thread {
    
        public Demo1(String name) {
            super(name);
        }
    
        @Override
        public void run() {
            while (!interrupted()) {
                System.out.println(getName() + "线程执行...");
                try {
                    Thread.sleep(200);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
        public static void main(String[] args) {
            Demo1 d1 = new Demo1("first-thread");
            Demo1 d2 = new Demo1("second-thread");
    
            d1.start();
            d2.start();
            d1.interrupt();
    
        }
    }
    

    实现Runnable接口

    /**
     * 作为线程任务存在
     */
    public class Demo2 implements Runnable {
    
        @Override
        public void run() {
            while (true) {
                System.out.println("thread running");
            }
        }
       
        public static void main(String[] args) {
            Thread thread = new Thread(new Demo2());
            thread.start();
        }
    }
    

    匿名内部类的方式

    public class Demo3 {
        public static void main(String[] args) {
            //该线程仅创建一次
            new Thread() {
                @Override
                public void run() {
                    while (true) {
                        System.out.println("thread start...");
                    }
                }
            }.start();
    
            new Thread(new Runnable() {
                @Override
                public void run() {
                    System.out.println("thread start...");
                }
            }).start();
    
            //执行结果为sub
            new Thread(new Runnable() {
                @Override
                public void run() {
                    System.out.println("runnable");
                }
            }) {
                @Override
                public void run() {
                    System.out.println("sub");
                }
            }.start();
        }
    }
    

    带返回值的线程

    public class Demo4 implements Callable<Integer> {
        public static void main(String[] args) throws ExecutionException, InterruptedException {
            //执行的任务
            Demo4 d = new Demo4();
            FutureTask<Integer> task = new FutureTask<Integer>(d);
            Thread t = new Thread(task);
            t.start();
            System.out.println("我先干点别的");
            //拿回返回结果
            Integer integer = task.get();
            System.out.println("线程执行的结果为:" + integer);
        }
    
        @Override
        public Integer call() throws Exception {
            System.out.println("正在进行紧张的计算");
            Thread.sleep(3000);
    
            return 1;
        }
    }
    

    定时器

    public class Demo5 {
    
        public static void main(String[] args) {
            Timer timer = new Timer();
            timer.schedule(new TimerTask() {
                @Override
                public void run() {
                    //实现定时任务
                    System.out.println("timertask is run");
                }
            }, 0, 1000);
        }
    }
    

    线程池的实现

    newFixedThreadPool:

    public class Demo6 {
    
        public static void main(String[] args) {
            ExecutorService threadPool = Executors.newFixedThreadPool(10);
    
            for (int i = 0; i < 100; i++) {
                threadPool.execute(new Runnable() {
                    @Override
                    public void run() {
                        System.out.println(Thread.currentThread().getName());
                    }
                });
            }
            threadPool.shutdown();
        }
    }
    

    newCachedThreadPool:

    public class Demo6 {
        public static void main(String[] args) {
    
            //比较智能的线程池,不够用就创建,够用就回收
            ExecutorService threadPool = Executors.newCachedThreadPool();
    
            for (int i = 0; i < 100; i++) {
                threadPool.execute(new Runnable() {
                    @Override
                    public void run() {
                        System.out.println(Thread.currentThread().getName());
                    }
                });
            }
    
            threadPool.shutdown();
        }
    }
    

    Lambda表达式实现

    public class Demo7 {
    
        public int add(List<Integer> values) {
    //        values.stream().forEach(System.out::println);
            return values.parallelStream().mapToInt(a -> a).sum();
        }
    
        public static void main(String[] args) {
            List<Integer> values = Arrays.asList(10, 20, 30, 40);
            int result = new Demo7().add(values);
            System.out.println(result);
        }
    }
    

    Spring 实现多线程

    Main方法:

    public class Application {
    
        public static void main(String[] args) {
            AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext(Config.class);
            DemoService bean = ac.getBean(DemoService.class);
            bean.a();
            bean.b();
        }
    
    }
    

    相关配置

    @Configuration
    @ComponentScan("com.autohome.data.realtime.demo")
    @EnableAsync
    public class Config {
    
    }
    

    异步代码:

    @Service
    public class DemoService {
    
        @Async
        public void a() {
            while (true) {
                System.out.println("a");
                try {
                    Thread.sleep(100);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
    
        }
        @Async
        public void b() {
            while (true) {
                System.out.println("b");
                try {
                    Thread.sleep(100);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    }
    
  • 相关阅读:
    worker与redis网络中断后,worker不再接受任务的异常问题
    Pyecharts 绘制动态流线地图
    MySql存储过程知识了解
    Pyecharts配置项使用
    Pandas一个需求:存在一个列表,需要在一个DataFrame中取到以该列表为索引的数据
    mysql时间与字符串之间相互转换
    map + apply + applymap
    pandas——read_csv
    Python 原生协程------asyncio(选自公众号)
    一道记数题
  • 原文地址:https://www.cnblogs.com/bigdata1024/p/10991099.html
Copyright © 2011-2022 走看看