如何创建多线程

线程的状态

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

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();
            }
        }
    }
}
posted @ 2019-06-08 17:49  chaplinthink  阅读(150)  评论(0编辑  收藏  举报