创建线程及线程池
2017-02-27 16:26
155 查看
创建线程有两种实现方案
1、创建类实现Runnable接口
2、创建类继承Thread类
线程类还有其他一些方法,sleep(),join(),setDaemon()等。
下面是线程的生命周期:
程序启动一个新线程成本是比较高的,因为它涉及到要与操作系统进行交互。而使用线程池可以很好的提高性能,尤其是当程序中要创建大量生存期很短的线程时,更应该考虑使用线程池。线程池里的每一个线程代码结束后,并不会死亡,而是再次回到线程池中成为空闲状态,等待下一个对象来使用。
public static ExecutorService newCachedThreadPool()
public static ExecutorService newFixedThreadPool(int nThreads)
public static ExecutorService newSingleThreadExecutor()
这些方法的返回值是ExecutorService对象,该对象表示一个线程池,可以执行Runnable对象或者Callable对象代表的线程。它提供了submit方法。
案例演示,步骤:
创建线程池对象
创建Runnable实例
提交Runnable实例
关闭线程池
匿名内部类方式使用多线程
1、创建类实现Runnable接口
2、创建类继承Thread类
package Thread03; //1.实现Runnable //定义类实现 Runnable 接口 //实现 run 方法 //把新线程要做的事写在 run 方法中 //创建自定义的 Runnable 的子类对象mt2 //创建 new Thread(Runnable ) 对象, 传入 mt2 //调用 thread.start()开启新线程, 内部会自动调用 Runnable 的run()方法 public class Thread2 implements Runnable { @Override public void run() { for (int i = 0; i < 1000; i++) { System.out.println("这是自定义线程。。。。"); } } }
package Thread03; public class Demo02 { public static void main(String[] args) { Thread2 thread2=new Thread2(); Thread thread = new Thread(thread2); thread.start(); for (int i = 0; i < 1000; i++) { System.out.println("这是主线程。。。"); } } }
package Thread03; // 2.继承Thread // 步骤: //* 定义类继承 Thread //* 重写 run 方法 //* 把新线程要做的事写在 run 方法中 //* 创建自定义类的线程对象 //* 开启新线程, 内部会自动执行 run 方法 public class Thread1 extends Thread{ public Thread1(String name){ super(name); } public Thread1(){ } public void run(){ for (int i = 0; i < 1000; i++) { System.out.println("这是自定义线程。。。。"+getName()); } } }
package Thread03; public class Demo01 { public static void main(String[] args) { Thread1 thread1=new Thread1();//创建一个Thread对象 ,就是开启一条线程 thread1.setName("登录");//设置线程名称 Thread1 thread2=new Thread1("注册");//在Thread1中编写有参数的构造方法,也可以设置线程名字 thread1.start();//注意开启线程使用start()方法 thread2.start();//有开启了一个线程 for (int i = 0; i < 1000; i++) { System.out.println("这是主线程。。。。。"+Thread.currentThread().getName()); } } }
线程类还有其他一些方法,sleep(),join(),setDaemon()等。
下面是线程的生命周期:
程序启动一个新线程成本是比较高的,因为它涉及到要与操作系统进行交互。而使用线程池可以很好的提高性能,尤其是当程序中要创建大量生存期很短的线程时,更应该考虑使用线程池。线程池里的每一个线程代码结束后,并不会死亡,而是再次回到线程池中成为空闲状态,等待下一个对象来使用。
public static ExecutorService newCachedThreadPool()
public static ExecutorService newFixedThreadPool(int nThreads)
public static ExecutorService newSingleThreadExecutor()
这些方法的返回值是ExecutorService对象,该对象表示一个线程池,可以执行Runnable对象或者Callable对象代表的线程。它提供了submit方法。
案例演示,步骤:
创建线程池对象
创建Runnable实例
提交Runnable实例
关闭线程池
package Thread02; public class MyRun implements Runnable { @Override public void run() { for (int i = 0; i < 1000; i++) { System.out.println("my run........"+Thread.currentThread().getName()); } } }
package Thread02; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.Future; public class Demo01 { public static void main(String[] args) { //创建线程池对象 ExecutorService pool = Executors.newFixedThreadPool(3); //创建Runnable实例 MyRun myRun1 = new MyRun(); MyRun myRun2 = new MyRun(); MyRun myRun3 = new MyRun(); //提交Runnable实例 Future<?> submit1 = pool.submit(myRun1); Future<?> submit2 = pool.submit(myRun2); Future<?> submit3 = pool.submit(myRun3); //关闭线程池 pool.shutdown(); } }
匿名内部类方式使用多线程
package Thread03; public class Demo03 { public static void main(String[] args) { new Thread("登录"){ public void run(){ for (int i = 0; i < 1000; i++) { System.out.println("run..."+getName()); } } }.start(); for (int i = 0; i < 1000; i++) { System.out.println("run..."+Thread.currentThread().getName());//这个地方可以写this.getName() } } }
package Thread03; public class Demo04 { public static void main(String[] args) { new Thread(new Runnable() { @Override public void run() { for (int i = 0; i < 1000; i++) { System.out.println("run..."+Thread.currentThread().getName());//此处不能使用this.getName(),因为this代表Runnable对象,但是它不是线程,所以会出错! } } }).start(); for (int i = 0; i < 1000; i++) { System.out.println("run..."+Thread.currentThread().getName()); } } }
相关文章推荐
- 多线程 创建-同步-线程锁-交互-线程池
- 线程实用解析---------(二)创建调用有参函数的线程和线程池简介
- 线程的三种创建方式与线程池合用
- C#使用线程池创建线程
- 创建线程以及管理线程池基本理解
- Java线程与创建Java程序中的线程池
- java线程池(3)-线程池创建新线程的过程(原理)
- 使用线程池而不是创建线程
- 线程管理(二)创建线程池管理线程
- python基础-线程创建、线程池、进\线程异步回调(add_done_callback)、进\线程数据共享、ftp线程池
- 线程实用解析---------(二)创建调用有参函数的线程和线程池简介
- 使用新的java线程池技术创建固定的线程去完成任务,都完成后计算总时间
- java线程一之创建线程、线程池以及多线程运行时间统计
- 创建线程池以管理线程
- [笔记][Java7并发编程实战手册]4.2 创建线程执行器newCachedThreadPool无界线程池
- 线程实用解析--------(二)创建调用有参函数的线程和线程池简介
- TCP并发服务器(六)——创建线程池,每个线程accept,accept使用互斥锁保护——基于UNP代码
- 创建指定大小,当空闲超时还会自动销毁线程的线程池
- 线程的两种创建及线程池——学习二
- 线程池内的异步线程创建UI控件,造成UI线程卡死无响应的问题分析