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();
}
}