1.extend Thread 类java
public class extendThreadClass extends Thread { public extendThreadClass(String name){ /* 调用父类的构造器,赋值name */ super(name); } @Override public void run() { while(!interrupted()){ System.out.println(getName()+"线程执行了。。。"); try { Thread.sleep(2000); } catch (InterruptedException e) { e.printStackTrace(); } } } public static void main(String[] args) { extendThreadClass demo1 = new extendThreadClass("Thread 1"); extendThreadClass demo2 = new extendThreadClass("Thread 2"); demo1.start(); demo2.start(); //stop方法只是让线程无限期等待,并无释放资源和锁之类的 interrupt推荐使用 可是使用该方法时, 须要判断线程是否处于中断状态 demo1.interrupt(); // //守护线程,程序执行完,跟着推出,跟随主线程完毕而完毕 // demo1.setDaemon(true); } } 须要注意的是复写父类的run方法, 父类的构造器有多种,原理是多态实现不一样参数下的构造, 主要参数分为线程组,线程名称,runable接口 还有stackSize栈的大小
其次就是setDeamon这个方法,这是个接收boolean值的方法,设置为true的状况下,代表为守护线程,意义在于,主线程执行完成时,不管该线程是否执行完成,也跟着主线程退出而退出,该种方式建立线程无返回值spring
2.implenment Runable多线程
public class implementRunable implements Runnable { /* 实现runable接口的本质,并非建立一个线程,而是建立一个线程任务,通俗意思就是,我知道我能作什么,可是我没有动力本身去作 面向接口 没有返回值,也不能抛出异常 */ @Override public void run() { while(true){ System.out.println("thread is run..."); } } public static void main(String[] args) { //使用Tread类的构造有参构造方法 Thread thread1 = new Thread(new implementRunable(),"thread1"); thread1.start(); } }
3.使用匿名内部类建立线程并发
/** * Created by 14029 on 2018/1/18. * 使用匿名内部类建立线程 * 适用于只使用一次的线程 * 匿名内部类必须实现一个接口 * 方法体中本质是实现接口的方法 * * 若是同时实现runable 和复写run方法 被执行的是被重写的run方法 ,,,由于不会去调父类的RUN方法 动态分派调用 多态实现 * 没有返回值,也不能抛出异常 */ public class useInnerClasswithoutname { public static void main(String[] args) { // new Thread(){ // public void run(){ // System.out.println("thread is run ....."); // }; // }.start(); // new Thread(new Runnable() { // @Override // public void run() { // System.out.println("runable is start"); // } // }).start(); new Thread(new Runnable() { @Override public void run() { System.out.println("runable is start"); } }){ public void run(){ System.out.println("Thread is start"); } }.start(); } }
4 . implements Callable<V>框架
/** * Created by 14029 on 2018/1/18. * 泛型指定返回值类型 */ public class implementsCallable implements Callable <Integer>{ @Override /* 相似RUN方法 */ public Integer call() throws Exception { System.out.println("is runing "); Thread.sleep(3000); return 1; } public static void main(String[] args) throws ExecutionException, InterruptedException { implementsCallable demo = new implementsCallable(); //FutureTask提早任务,本质是对runable接口的封装 实现线程任务 //提早任务,出现先执行了do other2 --》is runinng --》do other1 -->result 主线程继续执行 FutureTask<Integer> task1 = new FutureTask<Integer>(demo); Thread thread = new Thread(task1); thread.start(); System.out.println("i do other2"); int result = task1.get(); System.out.println("i do other1"); System.out.println("Thread result is ..."+result); } }
本质是对runable的继承和封装,而后建立task,建立线程,执行taskdom
5.使用线程池建立线程异步
/** * Created by 14029 on 2018/1/18. * 方便演示用的Executor * 同时说明如今的状况最好不用该种方式 */ public class usethreadpool { public static void main(String[] args) { //建立固定大小线程池 /* 线程池不容许使用Executors去建立,而是经过ThreadPoolExecutor的方式,这样的处理方式让写的同窗更加明确线程池的运行规则,规避资源耗尽的风险。 说明:Executors各个方法的弊端: 1)newFixedThreadPool和newSingleThreadExecutor: 主要问题是堆积的请求处理队列可能会耗费很是大的内存,甚至OOM。 2)newCachedThreadPool和newScheduledThreadPool: 主要问题是线程数最大数是Integer.MAX_VALUE,可能会建立数量很是多的线程,甚至OOM。 */ //改方法建立固定大小的线程池 Executor ThreadPool = Executors.newFixedThreadPool(10); //该方法随着线程任务的执行,动态分配线程池的大小 Executor ThreadPool1 = Executors.newCachedThreadPool(); ThreadPool.execute(new Runnable() { @Override public void run() { System.out.println("is running "); } }); } }
6.Use Timermaven
/** * Created by 14029 on 2018/1/18. * * 多用于定时任务,著名框架(quartz) * 使用定时器实现多线程 * 多线程并行处理定时任务时,Timer运行多个TimeTask时,只要其中之一没有捕获抛出的异常, 其它任务便会自动终止运行,使用ScheduledExecutorService则没有这个问题。 * 有返回值 * 不可控 */ public class useTimer { /* 定时任务 0延迟 1000毫秒一次 该方法是链式调用,只要其中之一没有捕获抛出的异常, 其它任务便会自动终止运行 */ public static void main(String[] args) { Timer timer = new Timer(); timer.schedule(new TimerTask() { @Override public void run() { //实现定时任务 System.out.println("task is run...."); } },0,1000); } }
7使用Spring 实现多线程ide
public class useSpring { /**使用spring 实现多线程,使用maven 导入Spring依赖 * 配置注解 @Configuration * 第一步配置扫描包 注解: @ComponentScan("包名") * 第二部打开异步 注解: @EnableAsync *第三步 建立 异步处理逻辑类 使用@service 将类交给Spring 管理 见 useSpringdomain * 第四部 domain */ } /* config类 Config.java @Configuration @ComponentScan("包名") @EnableAsync public class config{} */ /* useSpringdomain.java @Service public class useSpringdomain{ @Async 异步 public void a(){ while(true){ //todo } @Async 异步 public void b(){ while(true){ //todo } } } */ /* domain.java 核心: AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext(config.class) useSpringdomain demo1 =ac.getBean(useSpringdomain.class) demo1.a(); */
8 使用Lambda实现多线程线程
parallelStream 经过并发流的方式实现多线程。。。没有具体研究