- 线程池里的每一个线程代码结束后,并不会死亡,而是再次回到线程池中成为空闲状态,等待下一个对象来使用。
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(); } }
Future submit(Callable task) 提交值返回任务以执行,并返回代表任务待处理结果的Future。创建线程的第三种方式,需要结合线程池一起使用
回答:
- 有两种,一种是继承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(); } }