- 浏览: 564272 次
- 性别:
- 来自: 济南
文章分类
- 全部博客 (270)
- Ask chenwq (10)
- JSF (2)
- ExtJS (5)
- Life (19)
- jQuery (5)
- ASP (7)
- JavaScript (5)
- SQL Server (1)
- MySQL (4)
- En (1)
- development tools (14)
- Data mining related (35)
- Hadoop (33)
- Oracle (13)
- To Do (2)
- SSO (2)
- work/study diary (10)
- SOA (6)
- Ubuntu (7)
- J2SE (18)
- NetWorks (1)
- Struts2 (2)
- algorithm (9)
- funny (1)
- BMP (1)
- Paper Reading (2)
- MapReduce (23)
- Weka (3)
- web design (1)
- Data visualisation&R (1)
- Mahout (7)
- Social Recommendation (1)
- statistical methods (1)
- Git&GitHub (1)
- Python (1)
- Linux (1)
最新评论
-
brandNewUser:
楼主你好,问个问题,为什么我写的如下的:JobConf pha ...
Hadoop ChainMap -
Molisa:
Molisa 写道mapred.min.split.size指 ...
Hadoop MapReduce Job性能调优——修改Map和Reduce个数 -
Molisa:
mapred.min.split.size指的是block数, ...
Hadoop MapReduce Job性能调优——修改Map和Reduce个数 -
heyongcs:
请问导入之后,那些错误怎么解决?
Eclipse导入Mahout -
a420144030:
看了你的文章深受启发,想请教你几个问题我的数据都放到hbase ...
Mahout clustering Canopy+K-means 源码分析
搞起一个有意思的..
了解下多线程可以干嘛
第一个多线程展示一个有意思的多线程
第二个多线程展示怎么轮询每个多线程是否结束
第一多线程:
package cn.edu.xmu.dm.mt; import java.io.*; //多线程编程 public class MultiThread { public static void main(String args[]) { System.out.println("我是主线程!"); // 下面创建线程实例thread1 ThreadUseExtends thread1 = new ThreadUseExtends(); // 创建thread2时以实现了Runnable接口的THhreadUseRunnable类实例为参数 Thread thread2 = new Thread(new ThreadUseRunnable(), "SecondThread"); thread1.start();// 启动线程thread1使之处于就绪状态 // thread1.setPriority(6);//设置thread1的优先级为6 // 优先级将决定cpu空出时,处于就绪状态的线程谁先占领cpu开始运行 // 优先级范围1到10,MIN_PRIORITY,MAX_PRIORITY,NORM_PAIORITY // 新线程继承创建她的父线程优先级,父线程通常有普通优先级即5NORM_PRIORITY System.out.println("主线程将挂起7秒!"); try { Thread.sleep(7000);// 主线程挂起7秒 } catch (InterruptedException e) { return; } System.out.println("又回到了主线程!"); if (thread1.isAlive()) { thread1.stop();// 如果thread1还存在则杀掉他 System.out.println("thread1休眠过长,主线程杀掉了thread1!"); System.out.println("---------------thread1 kill" + thread1.getValue()); } else{ System.out.println("---------------thread1 stop" + thread1.getValue()); System.out.println("主线程没发现thread1,thread1已醒顺序执行结束了!"); } thread2.start();// 启动thread2 System.out.println("主线程又将挂起7秒!"); try { Thread.sleep(7000);// 主线程挂起7秒 } catch (InterruptedException e) { return; } System.out.println("又回到了主线程!"); if (thread2.isAlive()) { thread2.stop();// 如果thread2还存在则杀掉他 System.out.println("thread2休眠过长,主线程杀掉了thread2!"); } else System.out.println("主线程没发现thread2,thread2已醒顺序执行结束了!"); System.out.println("程序结束按任意键继续!"); try { System.in.read(); } catch (IOException e) { System.out.println(e.toString()); } }// main }// MultiThread class ThreadUseExtends extends Thread // 通过继承Thread类,并实现它的抽象方法run() // 适当时候创建这一Thread子类的实例来实现多线程机制 // 一个线程启动后(也即进入就绪状态)一旦获得CPU将自动调用它的run()方法 { private double value; ThreadUseExtends() { }// 构造函数 public void run() { System.out.println("我是Thread子类的线程实例!"); System.out.println("我将挂起10秒!"); System.out.println("回到主线程,请稍等,刚才主线程挂起可能还没醒过来!"); try { value = 10; sleep(10000);// 挂起5秒 } catch (InterruptedException e) { return; } // 如果该run()方法顺序执行完了,线程将自动结束,而不会被主线程杀掉 // 但如果休眠时间过长,则线程还存活,可能被stop()杀掉 } public double getValue() { return value; } public void setValue(double value) { this.value = value; } } class ThreadUseRunnable implements Runnable // 通过实现Runnable接口中的run()方法,再以这个实现了run()方法的类 // 为参数创建Thread的线程实例 { private double value; // Thread thread2=new Thread(this); // 以这个实现了Runnable接口中run()方法的类为参数创建Thread类的线程实例 ThreadUseRunnable() { }// 构造函数 public void run() { System.out.println("我是Thread类的线程实例并以实现了Runnable接口的类为参数!"); System.out.println("我将挂起1秒!"); System.out.println("回到主线程,请稍等 jn0-120 e20-040 ,刚才主线程挂起可能还没醒过来!"); try { Thread.sleep(1000);// 挂起5秒 value = 1; } catch (InterruptedException e) { return; } // 如果该run()方法顺序执行完了,线程将自动结束,而不会被主线程杀掉 // 但如果休眠时间过长,则线程还存活,可能被stop()杀掉 } public double getValue() { return value; } public void setValue(double value) { this.value = value; } } // 该程序可做的修改如改休眠时间或优先级setPriority()
package cn.edu.xmu.dm.mt;
import java.io.*; import java.util.concurrent.*; import java.util.*; class MyThreadPoolExecutor extends ThreadPoolExecutor { private boolean hasFinish = false; public MyThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue, RejectedExecutionHandler handler) { super(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue, handler); // TODO Auto-generated constructor stub } public MyThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue, ThreadFactory threadFactory, RejectedExecutionHandler handler) { super(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue, threadFactory, handler); // TODO Auto-generated constructor stub } public MyThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue, ThreadFactory threadFactory) { super(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue, threadFactory); // TODO Auto-generated constructor stub } public MyThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue) { super(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue); // TODO Auto-generated constructor stub } /* * (non-Javadoc) * * @see * java.util.concurrent.ThreadPoolExecutor#afterExecute(java.lang.Runnable, * java.lang.Throwable) */ @Override protected void afterExecute(Runnable r, Throwable t) { // TODO Auto-generated method stub super.afterExecute(r, t); synchronized (this) { System.out.println("自动调用了....afterEx 此时getActiveCount()值:" + this.getActiveCount()); if (this.getActiveCount() == 1)// 已执行完任务之后的最后一个线程 { this.hasFinish = true; this.notify(); }// if }// synchronized } public void isEndTask() { synchronized (this) { while (this.hasFinish == false) { System.out.println("等待线程池所有任务结束: wait..."); try { this.wait(); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } } }
第一个程序结束
第二个程序开始
package cn.edu.xmu.dm.mt; import java.io.File; /** * 统计文件的主类 * @author chenwq * */ public class Manager { /** * @param args */ public static void main(String[] args) { File[] roots = File.listRoots();//系统的根目录数组 ThreadListener tl = new ThreadListener();//监听统计文件线程的监控线程 for(int i=0;i<roots.length;i++){//根据根目录创建统计文件线程 CountFile cf = new CountFile(roots[i]); tl.array.add(cf); cf.start(); } tl.start(); } }package cn.edu.xmu.dm.mt;
/** * 统计文件的线程类 */ import java.io.File; public class CountFile extends Thread { // 根目录名 private File root; // 标志线程是否执行完毕的属性 private boolean finished; //要输出的信息 String info; // 构造器,传入一个根目录名 public CountFile(File root) { this.root = root; } // 查看线程是否已经执行完毕 public boolean isFinished() { return finished; } // 通过线程进行文件统计 public void run() { System.out.println(root+"盘文件统计开始"); int count = countProcess(root); info = root.getAbsolutePath()+"盘统计文件数为"+count+"\n"; finished = true; System.out.println(root+"盘文件统计完毕"); } private int countProcess(File dir) { int count = 0; if (!dir.exists()) {// 如果该文件指向的地址不存在 return count; } // 将文件中的子文件保存在文件数组中 File[] files = dir.listFiles(); if (files == null) {// 如果文件数组为空,则返回0 return count; } for (int i = 0; i < files.length; i++) { if (files[i].isDirectory()) {// 如果是文件夹 count += countProcess(files[i]); } else if (files[i].isFile()) {// 如果是标准文件 count++; } } return count; } }
package cn.edu.xmu.dm.mt; /** * 监视统计线程的线程类 */ import java.util.ArrayList; public class ThreadListener extends Thread{ ArrayList<CountFile> array = new ArrayList<CountFile>(); String result=""; public void run(){ boolean flag=false; while(!flag){ for(int i=0;i<array.size();i++){ if(array.get(i).isFinished()){//判断统计文件的线程是否已经完成 result+=array.get(i).info; array.remove(i);//将已经完成的线程对象从队列中移除 } } try {//每隔一定时间监听一次各个文件统计线程 Thread.sleep(50); } catch (InterruptedException e) { e.printStackTrace(); } if(array.size()==0){//如果统计线程都已经完成 flag=true; System.out.println(result); } } } }
发表评论
-
Java 常用正则表达式以及示例
2012-06-19 16:55 886众所周知,在程序开 ... -
Java实现排列组合
2012-06-15 21:47 17751、全排列 package cn.edu.xmu.dm ... -
Java: Sort a HashMap by its Value
2012-05-29 18:16 831When you use a TreeMap, the ... -
Java 动态代理机制分析及扩展
2012-05-19 23:26 0http://www.ibm.com/developerwor ... -
Java 编程的动态性—— 类、类装入以及反射机制
2012-05-19 23:23 0http://www.ibm.com/developerwor ... -
Java泛型
2012-05-19 23:16 01、Java泛型介绍 ... -
详解Java内存机制(堆与栈)的分配
2012-05-16 10:24 774Java 把内存划分成两种:一种是栈内存,另一种是堆 ... -
BFS解小孩分油问题
2012-04-24 20:45 2363广度优先搜索(Breadth-first Search)算法描 ... -
[转]Java操作(DOM、SAX、JDOM、DOM4J)xml方式的四种比较与详解
2012-04-09 17:34 958DOM(JAXP Crimson解析器) ... -
贪心算法解背包问题
2012-03-27 21:27 6097背包问题:与0-1背包问题类似,所不同的是在选择物品i装 ... -
sun.misc.BASE64Encoder找不到jar包的解决办法
2012-02-29 18:42 1023转自:http://archive.cnblogs.com/a ... -
Java Comparator 对象比较器
2012-02-17 17:39 882package cn.edu.xmu.ru.utils; ... -
Java反编译小工具!
2011-11-08 20:49 793你是否下载到一个jar,发现他的输入和输出不和你心愿,你没法调 ... -
myeclipse 解决内存溢出
2011-11-06 16:14 8921、修改eclipse.ini 在Myeclipse安装目录下 ... -
Java判断字符串是否全由数字组成
2011-10-26 19:19 3219public class RegxUtils { /** ... -
使用StringTokenizer统计文本行单词个数
2011-10-24 16:36 1056StringTokenizer strToke = new S ... -
Java时间戳计算代码执行时间
2011-10-24 09:56 2918import java.util.Calendar; p ... -
Java 常见异常Top 10
2011-10-23 21:25 760NO. 10 java.lang.StackOverf ... -
小技巧:代码中添加以下注解以方便代码的审查
2011-10-23 21:04 1087//TODO 作者名称 (待写入) //XXX 作者名称 ( ... -
遍历HashMap的两种方式比较
2011-10-22 09:41 1049HashMap存储的是键值对,所以一般情况下其遍历 ...
相关推荐
总之,Java多线程入门需要理解线程的基本概念、创建与管理,以及线程间通信和同步的各种机制。通过阅读《Java线程入门.pdf》这样的学习资料,结合实际编程实践,可以逐步掌握这门技术。在学习过程中,参考《E书说明....
### Java多线程入门知识点详解 #### 一、引言 多线程是现代软件开发中的重要技术之一,尤其在Java编程语言中占有极其重要的地位。对于任何一位Java程序员而言,掌握多线程的基本概念和技术是非常必要的。本文将...
Java多线程是Java编程中不可或缺的一部分,它允许程序同时执行多个任务,从而提高系统效率和响应速度。本文将从进程、线程的基本概念、Java中的多线程支持以及如何创建和控制线程等方面,为你提供一个入门级别的教程...
必知必会的多线程入门基础知识
Java多线程是Java开发中的重要概念,它允许程序同时执行多个任务,提高了程序的效率和响应速度。在Java中,实现多线程有两种主要方式:继承Thread类和实现Runnable接口。 1. 继承Thread类: 当一个类继承了Thread...
1. Java多线程学习(一)Java多线程入门 2. Java多线程学习(二)synchronized关键字(1) 3. Java多线程学习(二)synchronized关键字(2) 4. Java多线程学习(三)volatile关键字 5. Java多线程学习(四)...
"Java多线程入门知识及示例程序" Java多线程是一种非常重要的编程技术,它可以帮助开发者创建高效、可扩展的程序。多线程的出现是为了解决某些问题,如图形界面的出现、输入、输出的阻塞和多核CPU的更好利用等。 ...
内含 chapter02-chapter18 共 17 个实例性源码项目,内容循序渐进,由入门到精通。尤其适合于没有 Java 线程开发经验的朋友。自己动手敲出本资源解压缩后的 ...相信你理解了此源码之后,即可步入 Java 多线程开发。
### Java线程入门知识点详解 #### 一、Java线程基础知识概述 **1.1 什么是线程?** 线程是程序执行流的最小单元,是操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位。在Java中...
以下是对Java线程入门的详细讲解: 1. **线程的基本概念**: - 线程是操作系统分配CPU时间的基本单元,一个进程可以包含一个或多个线程。 - 在Java中,每个应用程序至少有一个主线程,它负责启动和控制其他线程。...
Java多线程是Java编程中的重要概念,尤其在开发高效并发应用程序时不可或缺。在这个入门程序中,我们将探讨Java如何创建和管理线程,...这个入门程序是很好的起点,它将引导你逐步理解Java多线程的核心概念和实践技巧。
随着现代处理器的生产工艺从提升...《Java多线程编程实战指南(核心篇)》适合有一定Java语言基础的读者作为入门多线程编程之用,也适合有一定多线程编程经验的读者作为重新梳理知识结构以提升认知层次和参考之用。
黑马+传智 Java入门到精通视频教程+课件+代码,30套Java开发项目代码,Java多线程与并发库高级应用视频教程,及电子书,面试题,开发工具等
### Java线程入门知识点详解 #### 一、Java线程概览 - **目标读者**:本教程面向那些已经熟练掌握Java语言基本应用但对多线程编程尚不熟悉的程序员。 - **主要内容**:本教程将从零开始介绍Java线程的基础知识,...
### Java多线程编程及入门知识点详解 #### 一、多线程基础知识 **1.1 什么是线程?** 线程是操作系统能够进行运算调度的最小单位,它被包含在进程之中,是进程中的实际运作单位。一个进程可以拥有多个线程,每个...
内容概要:本文详细介绍了Java多线程的基础...其他说明:本文通过实际案例和代码示例,深入浅出地讲解了Java多线程的核心知识点,有助于初学者快速入门并进阶。建议在学习过程中亲自编写并调试代码,以加深理解和记忆。
Java多线程是Java编程中的重要组成部分,它允许程序同时执行多个任务,从而提升系统效率。本资料旨在为初学者提供全面的多线程基础知识,帮助开发者快速掌握并实际运用多线程技术。 首先,我们要了解多线程的基本...
- Java提供了线程安全的集合类,如ConcurrentHashMap、CopyOnWriteArrayList等,它们在内部实现了线程同步,可以在多线程环境下安全地使用。 以上内容涵盖了Java线程的基本概念、创建方式、生命周期、同步机制、...