Java-多线程(Callable,线程池,匿名实现多线

1.线程池

  • 线程池里的每一个线程代码结束后,并不会死亡,而是再次回到线程池中成为空闲状态,等待下一个对象来使用。

如何实现线程池程序呢?

1.创建线程池对象,JDK新增了一个Executors工厂类来产生线程池,有如下几个静态方法

  • public static ExecutorService newCachedThreadPool()
  • public static ExecutorService newFixedThreadPool(int nThreads)
  • public static ExecutorService newSingleThreadExecutor()

2、如何往线程池中放线程?(可以放哪种线程)3、怎么运行
当提交到线程池的时候,就会自动启动一个线程执行

public class ThreadPoolDemo4 {
    public static void main(String[] args) {
        //创建线程池对象
        ExecutorService pool = Executors.newFixedThreadPool(2);

        //Future submit(Runnable task)
        //提交一个可运行的任务执行,并返回一个表示该任务的未来。
        MyRunnable2 myRunnable2 = new MyRunnable2();
        pool.submit(myRunnable2);
        pool.submit(myRunnable2);
        pool.submit(myRunnable2);

        //线程池需要手动关闭
        //void shutdown()
        //启动有序关闭,其中先前提交的任务将被执行,但不会接受任何新任务。
        pool.shutdown();


    }
}

匿名内部类实现多线程

package com.shujia.wyh.day27;

/*
    匿名内部类实现多线程
 */
public class ThreadDemo {
    public static void main(String[] args) {
        //实现多线程方式1:继承Thread类
        Thread t1 = new Thread("李毅") {
            @Override
            public void run() {
                for (int i = 1; i <= 300; i++) {
                    System.out.println(Thread.currentThread().getName() + ":" + i);
                }
            }
        };

        //实现多线程方式2:实现Runnable接口
        //借助Thread类创建线程对象
        Thread t2 = new Thread(new Runnable(){
            @Override
            public void run() {
                for(int i=1;i<=300;i++){
                    System.out.println(Thread.currentThread().getName()+":"+i);
                }
            }
        },"小虎");


        t1.start();
        t2.start();
    }
}

创建线程的第三种方式(Callable)

Future submit(Callable task) 提交值返回任务以执行,并返回代表任务待处理结果的Future。创建线程的第三种方式,需要结合线程池一起使用

面试题-Java有几种实现线程的方式

回答:

  • 有两种,一种是继承Thread类,重写run方法,使用start启动线程
  • 二,实现Runnable接口,实现run方法,结束Thread类创建线程对象,然后使用start方法执行
  • 三,还有一种方式实现,就是实现Callable 接口,实现call方法,需要结合线程池的方式创建线程对象,提交到线程池中运行。

代码

package com.shujia.wyh.day26;

import java.util.concurrent.Callable;

public class MyCallable implements Callable {
    @Override
    public Object call() throws Exception {
        for (int i = 1; i <= 200; i++) {
            System.out.println(Thread.currentThread().getName() + ":" + i);
        }
        return null;
    }
}
public class CallableDemo {
    public static void main(String[] args) {
        MyCallable myCallable = new MyCallable();

        //结合线程池使用
        //创建一个线程池对象
        ExecutorService pool = Executors.newFixedThreadPool(2);

        pool.submit(myCallable);
        pool.submit(myCallable);

        //关闭线程池
        pool.shutdown();
    }
}

匿名内部类方式实现多线程

public class NiMingThread1 {
    public static void main(String[] args) {
        Thread T1 = new Thread("我在这里赋值名字") {
            @Override
            public void run() {
                for (int i = 0; i <= 100; i++) {
                    System.out.println(Thread.currentThread().getName() + "我是1 :"+i);
                }
            }
        };

        Thread T2 = new Thread(new Runnable() {
            @Override
            public void run() {
                for (int i = 0; i <= 100; i++) {
                    System.out.println(Thread.currentThread().getName()+"我是2 :"+i);
                }
            }
        },"线程二");

        //启动两个线程
        T1.start();
        T2.start();

    }
}

你可能感兴趣的:(java,servlet,开发语言)