多线程(三)
来源:互联网 发布:淘宝 真皮皮带 编辑:程序博客网 时间:2024/06/06 12:39
线程池
线程池的好处:线程池里的每一个线程代码结束后,并不会死亡,而是再次回到线程池中成为空闲状态,等待下一个对象来使用。 如何实现线程的代码呢? A:创建一个线程池对象,控制要创建几个线程对象。 public static ExecutorService newFixedThreadPool(int nThreads) B:这种线程池的线程可以执行: 可以执行Runnable对象或者Callable对象代表的线程 做一个类实现Runnable接口。 C:调用如下方法即可 Future<?> submit(Runnable task) <T> Future<T> submit(Callable<T> task) D:我就要结束,可以吗? 可以。
package cn.itcast_08;public class MyRunnable implements Runnable { @Override public void run() { for (int x = 0; x < 100; x++) { System.out.println(Thread.currentThread().getName() + ":" + x); } }}
package cn.itcast_08;import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors;public class ExecutorsDemo { public static void main(String[] args) { // 创建一个线程池对象,控制要创建几个线程对象。 // public static ExecutorService newFixedThreadPool(int nThreads) ExecutorService pool = Executors.newFixedThreadPool(2); // 可以执行Runnable对象或者Callable对象代表的线程 pool.submit(new MyRunnable()); pool.submit(new MyRunnable()); //结束线程池 pool.shutdown(); }}
多线程实现方式3
多线程实现的方式3: A:创建一个线程池对象,控制要创建几个线程对象。 public static ExecutorService newFixedThreadPool(int nThreads) B:这种线程池的线程可以执行: 可以执行Runnable对象或者Callable对象代表的线程 做一个类实现Runnable接口。 C:调用如下方法即可 Future<?> submit(Runnable task) <T> Future<T> submit(Callable<T> task) D:我就要结束,可以吗? 可以。
package cn.itcast_09;import java.util.concurrent.Callable;//Callable:是带泛型的接口。//这里指定的泛型其实是call()方法的返回值类型。public class MyCallable implements Callable { @Override public Object call() throws Exception { for (int x = 0; x < 100; x++) { System.out.println(Thread.currentThread().getName() + ":" + x); } return null; }}
package cn.itcast_09;import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors;public class CallableDemo { public static void main(String[] args) { //创建线程池对象 ExecutorService pool = Executors.newFixedThreadPool(2); //可以执行Runnable对象或者Callable对象代表的线程 pool.submit(new MyCallable()); pool.submit(new MyCallable()); //结束 pool.shutdown(); }}
线程求和案例
package cn.itcast_10;import java.util.concurrent.Callable;public class MyCallable implements Callable<Integer> { private int number; public MyCallable(int number) { this.number = number; } @Override public Integer call() throws Exception { int sum = 0; for (int x = 1; x <= number; x++) { sum += x; } return sum; }}
package cn.itcast_10;import java.util.concurrent.ExecutionException;import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors;import java.util.concurrent.Future;public class CallableDemo { public static void main(String[] args) throws InterruptedException, ExecutionException { // 创建线程池对象 ExecutorService pool = Executors.newFixedThreadPool(2); // 可以执行Runnable对象或者Callable对象代表的线程 Future<Integer> f1 = pool.submit(new MyCallable(100)); Future<Integer> f2 = pool.submit(new MyCallable(200)); // V get() Integer i1 = f1.get(); Integer i2 = f2.get(); System.out.println(i1); System.out.println(i2); // 结束 pool.shutdown(); }}
匿名内部类实现
package cn.itcast_11;/* * 匿名内部类的格式: * new 类名或者接口名() { * 重写方法; * }; * 本质:是该类或者接口的子类对象。 */public class ThreadDemo { public static void main(String[] args) { // 继承Thread类来实现多线程 new Thread() { public void run() { for (int x = 0; x < 100; x++) { System.out.println(Thread.currentThread().getName() + ":" + x); } } }.start(); // 实现Runnable接口来实现多线程 new Thread(new Runnable() { @Override public void run() { for (int x = 0; x < 100; x++) { System.out.println(Thread.currentThread().getName() + ":" + x); } } }) { }.start(); // 更有难度的,执行的是world new Thread(new Runnable() { @Override public void run() { for (int x = 0; x < 100; x++) { System.out.println("hello" + ":" + x); } } }) { public void run() { for (int x = 0; x < 100; x++) { System.out.println("world" + ":" + x); } } }.start(); }}
定时器
定时器:可以让我们在指定的时间做某件事情,还可以重复的做某件事情。 依赖Timer和TimerTask这两个类: Timer:定时 public Timer() public void schedule(TimerTask task,long delay) public void schedule(TimerTask task,long delay,long period) public void cancel() TimerTask:任务
package cn.itcast_12;import java.util.Timer;import java.util.TimerTask;public class TimerDemo { public static void main(String[] args) { // 创建定时器对象 Timer t = new Timer(); // 3秒后执行爆炸任务 // t.schedule(new MyTask(), 3000); //结束任务 t.schedule(new MyTask(t), 3000); }}// 做一个任务class MyTask extends TimerTask { private Timer t; public MyTask(){} public MyTask(Timer t){ this.t = t; } @Override public void run() { System.out.println("beng,爆炸了"); t.cancel(); }}
public class TimerDemo2 { public static void main(String[] args) { // 创建定时器对象 Timer t = new Timer(); // 3秒后执行爆炸任务第一次,如果不成功,每隔2秒再继续炸 t.schedule(new MyTask2(), 3000, 2000); }}// 做一个任务class MyTask2 extends TimerTask { @Override public void run() { System.out.println("beng,爆炸了"); }}
练习题
需求:在指定的时间删除我们的指定目录(你可以指定c盘,但是我不建议,我使用项目路径下的demo)
package cn.itcast_12;import java.io.File;import java.text.ParseException;import java.text.SimpleDateFormat;import java.util.Date;import java.util.Timer;import java.util.TimerTask;class DeleteFolder extends TimerTask { @Override public void run() { File srcFolder = new File("demo"); deleteFolder(srcFolder); } // 递归删除目录 public void deleteFolder(File srcFolder) { File[] fileArray = srcFolder.listFiles(); if (fileArray != null) { for (File file : fileArray) { if (file.isDirectory()) { deleteFolder(file); } else { System.out.println(file.getName() + ":" + file.delete()); } } System.out.println(srcFolder.getName() + ":" + srcFolder.delete()); } }}public class TimerTest { public static void main(String[] args) throws ParseException { Timer t = new Timer(); String s = "2014-11-27 15:45:00"; SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); Date d = sdf.parse(s); t.schedule(new DeleteFolder(), d); }}
面试题
1: 多线程有几种实现方案,分别是哪几种? 两种。 继承Thread类 实现Runnable接口 扩展一种:实现Callable接口。这个得和线程池结合。2: 同步有几种方式,分别是什么? 两种。 同步代码块 同步方法3: 启动一个线程是run()还是start()?它们的区别? start(); run():封装了被线程执行的代码,直接调用仅仅是普通方法的调用 start():启动线程,并由JVM自动调用run()方法4: sleep()和wait()方法的区别 sleep():必须指时间;不释放锁。 wait():可以不指定时间,也可以指定时间;释放锁。5: 为什么wait(),notify(),notifyAll()等方法都定义在Object类中 因为这些方法的调用是依赖于锁对象的,而同步代码块的锁对象是任意锁。 而Object代码任意的对象,所以,定义在这里面。6: 线程的生命周期图 新建 -- 就绪 -- 运行 -- 死亡 新建 -- 就绪 -- 运行 -- 阻塞 -- 就绪 -- 运行 -- 死亡 建议:画图解释。
0 0
- 多线程同步(三)
- C++多线程(三)
- 多线程(三)Join
- 多线程总结(三)
- 多线程(三)
- c++多线程(三)
- c++多线程(三)
- java多线程(三)
- C++多线程(三)
- c++多线程(三)
- C#多线程(三)
- 浅谈-----多线程(三)
- 多线程三(交互)
- C++多线程(三)
- java多线程(三)
- java多线程(三)
- 多线程(三)
- C#多线程(三)
- QML动画之PropertyAnimation(属性动画)
- Python缓存机制介绍
- Shadow mapping
- 面向对象与面向过程的区别
- 单链表创建
- 多线程(三)
- 【杭电】[3790]最短路径问题
- Android 中Webview 自适应屏幕
- SVM算法教科书(一)
- android的消息处理机制
- 为什么你应该(从现在开始就)写博客
- 【概念】协议理解之HTTPS
- docker启动Mysql
- 判断移动端PC端访问网页时跳转到对应的移动端网页