标签:多线程 线程回收释放
主函数:
package com.thread; import java.util.ArrayList; import java.util.Iterator; import java.util.List; public class WorkThreadSample { public static void main(String args[]) throws InterruptedException { // 任务List: 15个任务 List<Work> workList = new ArrayList<Work>(); for (int i = 0; i < 4; i++) { workList.add(new Work("任务" + i)); } // 执行任务的线程:3个 for (int i = 0; i < 3; i++) { WorkThread thread = new WorkThread(workList, "线程" + i);// 线程名,需要什么参数可以向里面传递。 thread.start();// 启动线程 } /* * 睡眠6秒后,线程已经执行完毕,这时候会发现刚刚运行的线程已经没有了, 所以,线程在执行完run方法后,JVM会自动回收处理。 * 不用我们手动释放。 * 将下面的代码注释注释掉,可以看到线程在执行完run方法后,就自动回收了,已经没有Thread-0,Thread-1,Thread-2 了。 */ // new Thread().sleep(6000); // /** // * 在Java的文档中为我们提供了Thread类的完整文档 // */ // // 在Thread对象中取得所有的线程所在的栈,然后取得Set对象,便利取得所有的线程 // Iterator iterator = Thread.getAllStackTraces().keySet().iterator(); // Thread myThread = null; // while (iterator.hasNext()) { // Thread t = (Thread) iterator.next(); // System.err.println("=========iterator.next():" + t.getName()); // boolean alive = t.isAlive(); // System.out.println(t+"的状态为:" + alive); // // 根据线程名取得自己想要的线程 // if (t.getName().equals("Thread-1") && alive) { // myThread = t; // System.err.println("===线程名,优先级,线程组=======:" + myThread.toString()); // break; // } // } } }
业务类:
package com.thread; public class Work { // 任务名 private String name = null; public Work(String name) { this.name = name; } // 任务内容 public void work(String worker) { try { new Thread().sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(worker + "线程:" + name + "结束!"); } }
线程类:
package com.thread; import java.util.List; public class WorkThread extends Thread{ // 线程名 public String name = null; // 任务List private List<Work> workList = null; public WorkThread(List<Work> workList, String name) { this.name = name; this.workList = workList; } public void run() { System.out.println(name + " 线程开始执行..."); while (true) { Work work = null; {//同步代码块 // 同步锁,放在循环里是不让该线程一直占用workList synchronized (workList) { // 任务List中有任务时进行循环 if (workList != null && !workList.isEmpty()) { // 取得一个任务,并从任务List中删除该任务 work = workList.remove(0); // System.out.println("------------"+workList.size()); } else { // 所有任务都完成 break; } } /** * 注意这里不能放在synchronized 中,否则就只能一个一个 的执行了,达不到多线程并发的需求,所以讲业务放到外面,用一个同步代码块包裹,这样就运行更快。 * 执行任务,例: */ work.work(name); } } System.out.println(name+"执行完成"); } }
运行结果为:
线程1 线程开始执行... 线程2 线程开始执行... 线程0 线程开始执行... 线程2线程:任务1结束! 线程0线程:任务2结束! 线程1线程:任务0结束! 线程2线程:任务3结束! 线程0线程:任务4结束! 线程1线程:任务5结束! 线程1线程:任务8结束! 线程2线程:任务6结束! 线程0线程:任务7结束! 线程1执行完成 线程0执行完成 线程2线程:任务9结束! 线程2执行完成
总结:
①线程创建是消耗一定资源的,所以不能创建太多线程。
②线程执行完run方法后,会自动回收。
③我们对线程上锁,只锁最重要的东西,唯一的东西,不可重复的。其他不用上锁,用同步代码块就可以了。
④每个线程的执行时间不一样长,有的快,有的慢。
⑤线程运行后要跳出while(true) 循环,否则会一直运行。
2017年1月22日17:11:14
本文出自 “JianBo” 博客,转载请与作者联系!
标签:多线程 线程回收释放
原文地址:http://jianboli.blog.51cto.com/12075002/1893754