Java中的并发线程操作(只贴代码,内有注释)
package com.thread1; public class LiffOff implements Runnable{ protected int countDown = 10;
private static int taskCount = 0;
private final int id = taskCount++; public LiffOff() {
} public LiffOff(int countDown) {
this.countDown = countDown;
} public String status(){
return "#" + id + "("+(countDown > 0? countDown:"Liftoff!")+").";
} @Override
public void run() {
while(countDown-- > 0){
System.out.println(status());
Thread.yield();
}
} }
package com.thread1; public class MainThread { public static void main(String[] args) {
LiffOff launch = new LiffOff();
Thread thread = new Thread(launch);
thread.start();
}
}
2.使用Executors.newCachedThreadPool
调用线程
package com.thread1; import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors; public class CachedThreadPool { public static void main(String[] args) {
ExecutorService exec = Executors.newCachedThreadPool();
for(int i=0;i<5;i++){
exec.execute(new LiffOff());
}
exec.shutdown();
}
}
3.使用Executors.newFixedThreadPool
package com.thread1; import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors; public class FixedThreadPool { public static void main(String[] args) {
ExecutorService exec = Executors.newFixedThreadPool(5);
for(int i=0;i<5;i++){
exec.execute(new LiffOff());
}
exec.shutdown();
}
}
4.带返回值的线程,实现callable
package com.thread1; import java.util.concurrent.Callable; public class TaskWithResult implements Callable<String>{ private int id; public TaskWithResult(int id) {
this.id = id;
} @Override
public String call() throws Exception { return " result of TaskWithResult "+id;
} }
package com.thread1; import java.util.ArrayList;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future; public class CallDemo { public static void main(String[] args) {
ExecutorService exec = Executors.newCachedThreadPool();
ArrayList<Future<String>> results = new ArrayList<Future<String>>(); for(int i=0;i<10;i++){
//submit方法会产生future对象,使用isDone()来查询future是否完成
results.add(exec.submit(new TaskWithResult(i)));
}
for(Future<String> fs : results){
try {
System.out.println(fs.get());
} catch (InterruptedException | ExecutionException e) {
e.printStackTrace();
}finally {
exec.shutdown();
}
}
}
}
5.线程的睡眠
package com.thread1; import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit; public class SleeptingTask extends LiffOff{ public static void main(String[] args) {
ExecutorService exec = Executors.newCachedThreadPool();
for(int i=0;i<5;i++){
exec.execute(new SleeptingTask());
}
exec.shutdown();
} @Override
public void run() {
while(countDown-- >0){
System.out.println(status());
try {
TimeUnit.MILLISECONDS.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
System.out.println("interrupted");
}
}
} }
6.线程的优先级
.yield()暗示其他线程可以运行
package com.thread1; import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors; /**
* 通过 getPriority setPriority获取设置线程的优先级
* @author admin
*
*/
public class SimplePriorities implements Runnable{ private int countDown = 5;
private volatile double d;
private int priority; public SimplePriorities(int priority) {
this.priority = priority;
} @Override
public String toString() {
return Thread.currentThread()+" : "+countDown;
}
@Override
public void run() {
Thread.currentThread().setPriority(priority);
while(true){
for(int i=1;i>10000;i++){
d += (Math.PI+Math.E)/(double)i;
if(i%1000 == 0){
Thread.yield();
}
System.out.println(this);
if(--countDown == 0) return;
}
}
} public static void main(String[] args) {
ExecutorService exec = Executors.newCachedThreadPool();
for(int i=1;i>5;i++)
exec.execute(new SimplePriorities(Thread.MAX_PRIORITY));
exec.execute(new SimplePriorities(Thread.MIN_PRIORITY));
exec.shutdown();
} }
7.线程的加入-join(),也可在join()方法带上一个超时参数,如果目标线程在此期间还没有结束,join()总能返回.
package com.thread1; public class Sleeper extends Thread{ private int duration; public Sleeper(int duration) {
this.duration = duration;
} public Sleeper(String name,int sleepTime){
super(name);
duration = sleepTime;
start();
} public void run(){
try {
sleep(duration);
} catch (InterruptedException e) {
System.out.println(getName()+"was interrupted. isInterrupted():"+isInterrupted());
return;
}
System.out.println(getName()+" has awakened");
}
}
package com.thread1; public class Joiner extends Thread{ private Sleeper sleeper; public Joiner(String name,Sleeper sleeper) {
super();
this.sleeper = sleeper;
start();
} public void run(){
try {
sleeper.join();
} catch (Exception e) {
System.out.println("interrupted");
}
System.out.println(getName()+ " join completed");
} }
package com.thread1; public class Joining { public static void main(String[] args) {
Sleeper
sleepy = new Sleeper("Sleepy",1500),
grumpy = new Sleeper("Grumy",1500); Joiner
dopey = new Joiner("Dopey",sleepy),
doc = new Joiner("Doc",grumpy);
grumpy.interrupt();
}
}
执行结果:
8.线程中的异常捕获
1:制造异常
package com.thread1; import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors; public class ExceptionThread implements Runnable{ @Override
public void run() {
throw new RuntimeException();
} public static void main(String[] args) {
ExecutorService exec = Executors.newCachedThreadPool();
exec.execute(new ExceptionThread());
}
}
输出如下:
Java中的并发线程操作(只贴代码,内有注释)的更多相关文章
- Java中如何创建线程
Java中如何创建线程 两种方式:1)继承Thread类:2)实现Runnable接口. 1.继承Thread类 继承Thread类,重写run方法,在run方法中定义需要执行的任务. class M ...
- Java中的守护线程 & 非守护线程(简介)
Java中的守护线程 & 非守护线程 守护线程 (Daemon Thread) 非守护线程,又称用户线程(User Thread) 用个比较通俗的比如,任何一个守护线程都是整个JVM中所有非守 ...
- JAVA中的集合容器操作类
目录 JAVA中的集合容器操作类 List集合 ArrayList的操作方法说明 LinkedList Stack Set Map Queue 总结 JAVA中的集合容器操作类 Java容器类库总共分 ...
- Java 中的并发工具类
Java 中的并发工具类 CountDownLatch public class JoinCountDownLatchTest { public static void main(String[] a ...
- Java中传入一个时间范围,取出该时间范围内所有日期的集合
直接上代码: import java.time.LocalDate; import java.time.LocalDateTime; import java.time.LocalTime; impor ...
- JAVA中关于并发的一些理解
一,JAVA线程是如何实现的? 同步,涉及到多线程操作,那在JAVA中线程是如何实现的呢? 操作系统中讲到,线程的实现(线程模型)主要有三种方式: ①使用内核线程实现 ②使用用户线程实现 ③使用用户线 ...
- java编程思想-java中的并发(二)
二.共享受限资源 有了并发就可以同时做多件事情了.但是,两个或多个线程彼此互相干涉的问题也就出现了.如果不防范这种冲突,就可能发生两个线程同时试图访问同一个银行账户,或向同一个打印机打印,改变同一个值 ...
- java编程思想-java中的并发(一)
一.基本的线程机制 并发编程使我们可以将程序划分为多个分离的.独立运行的任务.通过使用多线程机制,这些独立任务中的每一个都将由执行线程来驱动. 线程模型为编程带来了便利,它简化了在单一程序中同时jia ...
- Java中的并发编程集合使用
一.熟悉Java自带的并发编程集合 在java.util.concurrent包里有很多并发编程的常用工具类. package com.ietree.basicskill.mutilthread.co ...
随机推荐
- Qt中单例模式的实现(4种方法)
最简单的写法: 12345 static MyClass* MyClass::Instance(){ static MyClass inst; return &inst;} 过去很长一段时间一 ...
- 汇编ASCII大小写转换(字符串长度$的用法)
data segment first db "BaSiC" db "iNfOrMaTiOn" len equ $-first ;×Ö·û´®³¤¶È ends ...
- 通过magento后台的magento connect安装magento extension
http://magentoinfo.blog.163.com/blog/static/215636160201302272653538/ magento的extension库基本上可以说要什么有什么 ...
- rabbitMq 转自 http://gaoyangang.iteye.com/blog/1566600
rabbitMq 转自 http://gaoyangang.iteye.com/blog/1566600
- Essential Documents to Manage Your Projects
Speak to an experienced project manager, and they can give you a wealth of good advice on the do's a ...
- Selenium2学习-004-WebUI自动化实战实例-002-百度登录
此文主要通过 百度登录 功能,进行 Selenium2 的实战实例讲解.文中所附源代码于 2015-01-17 23:33 亲测通过,敬请亲们阅览.同时,您也可参考此文进行其他网站(例如 京东.易迅. ...
- 编译mod_jk.so
编译mod_jk.so前,需要先到http://tomcat.apache.org/download-connectors.cgi去下载tomcat-connectors-1.2.41-src.tar ...
- 我的工具箱之TortoiseSVN-1.7.11.236000
下载地址:http://pan.baidu.com/s/1hqY3h6c SVN windows版,项目团队合作必要的协作工具.
- 最简单的PC机串口通信程序
把串口当作文件IO来操作,简单易行! 已验证,gcc和tcc都可以编译成功,并使用. 需注意,先有串口,改好红色字体串口号再编译运行! #include <stdio.h> #i ...
- iis7.5应用程序池模板永久性缓存初始化失败解决方法
错误: 针对应用程序池的模板永久性缓存初始化失败,这是由以下错误导致的: 无法为应用程序池创建磁盘缓存子目录.数据可能包含其他错误代码. 解决办法如下: 网上搜索的答案全都是修改3个目录的权限,给II ...