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 ...
随机推荐
- Servlet Threading Model
Servlet Threading Model The scalability issues of Java servlets are caused mainly by the server thre ...
- insert into hi_user_score set hello_id=74372073,a=10001 on duplicate key update hello_id=74372073, a=10001
insert into hi_user_score set hello_id=74372073,a=10001 on duplicate key update hello_id=74372073, a ...
- Wordpress更改后台地址
wordpress默认的后台地址是 xx/wp-admin 或xx/wp-login.php ,谁都知道感觉很不安全, 方法一:使用插件 通过插件在地址上加上只有你知道的参数才能访问 1.后台搜索插 ...
- 读propert文件
PropertiesUtil.java package utils; import java.io.BufferedInputStream; import java.io.FileInputStrea ...
- The Simplified Project Management Process
One of the challenges of explaining project management to people who are unfamiliar with the approac ...
- Rails进阶参考
https://gist.github.com/xdite/4044f3a037de029bc35c From idea to products: - Ideation, wireframes, mo ...
- angularJs之模块化
<!DOCTYPE HTML><html ng-app="myApp"><head><meta http-equiv="Cont ...
- js实现图片向上播放(轮番滚动)
js实现图片向上播放(轮番滚动) 实现方式,多种多样,这里我们来看javascript实现方式,重点是研究里面的源代码: 看看别人是如何写出“优雅的代码” <!DOCTYPE html PUBL ...
- OC 对象和匿名对象
OC 对象和匿名对象 对象和匿名对象的定义: 当new出一个对象时,如果用一个指针接收这个对象,那么这个指针通常被称为对象. 如果new出的对象,不用指针接收,那么这个对象就称为匿名对象. #impo ...
- VS2013+qt-vs-addin-1.2.4安装配置
--------------------------开头这部分可以跳过,仅作为笔记----------------------- 我问过的问题: http://www.codeproject.com/ ...