线程池
JDK1.5之后,实现了线程池程序;
java.util.concurrent
类Executors:工厂类,创建线程池工厂;
(方法)static ExecutorService newFixedThreadPool(int nThreads):创建池子,参数为个数,返回值为线程池对象;
步骤:
1、创建线程池对象;
2、创建Runnable接口子类对象;
3、提交Runnable接口子类对象;
测试类
ExecutorService es = Executors.newFixedThreadPool(2);//创建线程池
es.submit(new RunnableDemo());
Runnable接口实现类
public class RunnableDemo implements Runnable{
@Override
public void run(){
System.out.println(Thread.currentThread().getName()+"的方法");
}
}
执行结果
ExecutorService es = Executors.newFixedThreadPool(2);//创建线程池
es.shutdown();//停止线程池
创建线程的方式③(实现Callable接口)
实现步骤:
1、工厂类Executors静态方法newFixedThreadPool方法,创建线程池对象;
2、线程池对象ExecutorService接口实现类,调用submit提交线程任务;
Future<T> submit(Callable c)
Future的get()方法获取线程任务的返回值
测试类
ExecutorService es = Executors.newFixedThreadPool(2);//创建线程池
Future<String> submit = es.submit(new CallableDemo());
String s = submit.get();
System.out.println(s);
实现类
public class CallableDemo implements Callable<String> { @Override public String call(){ return "abc"; }}
执行结果:abc
线程安全
解决安全问题,同步技术
synchronized(任意对象){
线程要操作的共享数据
}
同步代码块
对象:同步锁,对象监视器;
保证安全,没有锁的线程不能执行;
学习草图
电影院售票案例
测试类
Tickets t=new Tickets();
Thread t0=new Thread(t);
Thread t1=new Thread(t);
Thread t2=new Thread(t);
t0.start();
t1.start();
t2.start();
实现类
public class Tickets implements Runnable {
int ticket=100;
Object obj=new Object();
@Override
public void run() {
while(true){
synchronized (obj) {//任意对象,new Object()不可以
if (ticket > 0) {
try {
Thread.sleep(1000);//休眠 单位为毫秒
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName() + "出售第" + ticket--);
}
}
}
}
}