继承Thread
继承Thread去执行任务,确实可以开启一个线程去执行任务,如果经常的去开启一些线程,也会导致系统资源的浪费。
- public static class Mythread extends Thread{
- @Override
- public void run() {
- System.out.println("当前线程"+Thread.currentThread().getId());
- int i = 10/2;
- System.out.println("运行结果"+i);
- }
- }
- //调用线程。
- public static void main(String[] args) throws ExecutionException, InterruptedException {
-
- Mythread mythread = new Mythread();
- mythread.start();//启动线程
- System.out.println("main--end");
- }
实现Runnale接口。
- public static class MyRunable implements Runnable {
-
- @Override
- public void run() {
- System.out.println("当前线程"+Thread.currentThread().getId());
- int i = 10/2;
- System.out.println("运行结果"+i);
-
- }
- }
调用。
-
-
- MyRunable runable = new MyRunable();
- new Thread(runable).start();
- System.out.println("main--end");
Callable
-
-
- public static class Callale01 implements Callable<Integer> {
-
- @Override
- public Integer call() throws Exception {
- System.out.println("当前线程"+Thread.currentThread().getId());
- int i = 10/2;
- System.out.println("运行结果"+i);
- return i;
- }
- }
调用。这里需要用callable构建futureTask
-
- FutureTask<Integer> futureTask =new FutureTask<>(new Callale01());
- //取返回结果。
- Integer i = futureTask.get();
- new Thread(futureTask).start();
- System.out.println("返回结果是:"+i);
线程池
线程池才是我们java开发中,经常用到一种开启多线程的方式,线程池,自己去管理线程。可以节省系统资源。通常我们会将下面的一些配置写在一些配置类中
-
- ThreadPoolExecutor executor = new ThreadPoolExecutor(5,100,10,TimeUnit.SECONDS,
- new LinkedBlockingQueue<>(100),
- Executors.defaultThreadFactory(),new ThreadPoolExecutor.AbortPolicy());
常见的4种线程池。
1 newCachedThreadPool()
创建一个可缓存的线程池,如果线程池长度超过了处理的需要,可灵活的回收空闲线程。若无可回收。则创建新线程。
- Executors.newCachedThreadPool();
2.newFixedThreadPool(6)
创建一个固定大小的线程池。
3 newScheduledThreadPool()
定时任务的线程池。
4.newSingleThreadExecutor()
- Executors.newSingleThreadExecutor();