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中的并发线程操作(只贴代码,内有注释)的更多相关文章

  1. Java中如何创建线程

    Java中如何创建线程 两种方式:1)继承Thread类:2)实现Runnable接口. 1.继承Thread类 继承Thread类,重写run方法,在run方法中定义需要执行的任务. class M ...

  2. Java中的守护线程 & 非守护线程(简介)

    Java中的守护线程 & 非守护线程 守护线程 (Daemon Thread) 非守护线程,又称用户线程(User Thread) 用个比较通俗的比如,任何一个守护线程都是整个JVM中所有非守 ...

  3. JAVA中的集合容器操作类

    目录 JAVA中的集合容器操作类 List集合 ArrayList的操作方法说明 LinkedList Stack Set Map Queue 总结 JAVA中的集合容器操作类 Java容器类库总共分 ...

  4. Java 中的并发工具类

    Java 中的并发工具类 CountDownLatch public class JoinCountDownLatchTest { public static void main(String[] a ...

  5. Java中传入一个时间范围,取出该时间范围内所有日期的集合

    直接上代码: import java.time.LocalDate; import java.time.LocalDateTime; import java.time.LocalTime; impor ...

  6. JAVA中关于并发的一些理解

    一,JAVA线程是如何实现的? 同步,涉及到多线程操作,那在JAVA中线程是如何实现的呢? 操作系统中讲到,线程的实现(线程模型)主要有三种方式: ①使用内核线程实现 ②使用用户线程实现 ③使用用户线 ...

  7. java编程思想-java中的并发(二)

    二.共享受限资源 有了并发就可以同时做多件事情了.但是,两个或多个线程彼此互相干涉的问题也就出现了.如果不防范这种冲突,就可能发生两个线程同时试图访问同一个银行账户,或向同一个打印机打印,改变同一个值 ...

  8. java编程思想-java中的并发(一)

    一.基本的线程机制 并发编程使我们可以将程序划分为多个分离的.独立运行的任务.通过使用多线程机制,这些独立任务中的每一个都将由执行线程来驱动. 线程模型为编程带来了便利,它简化了在单一程序中同时jia ...

  9. Java中的并发编程集合使用

    一.熟悉Java自带的并发编程集合 在java.util.concurrent包里有很多并发编程的常用工具类. package com.ietree.basicskill.mutilthread.co ...

随机推荐

  1. 【Android测试】【随笔】在手机里用命令行创建中文文件夹

    ◆版权声明:本文出自胖喵~的博客,转载必须注明出处. 转载请注明出处:http://www.cnblogs.com/by-dream/p/4580319.html 不知道为啥当时自己写了一段在手机里用 ...

  2. 规则html表单对象赋值

    function grid_load_callback(data, status) {            if (data.rows.length > 0)            {     ...

  3. 设计模式:策略模式(Strategy)

    定   义:它定义了算法家族,分别封装起来,让它们之间可以互相替换,此模式让算法的变化, 不会影响到使用算法的客户. 示例:商场收银系统,实现正常收费.满300返100.打8折.......等不同收费 ...

  4. Ajax如何实现跨域问题

    一个域名的组成 http:// www . abc.com : 8080 /scripts/jquery.js 协议 子域名 主域名 端口号 请求资源地址 当协议.子域名.主域名.端口号中任意一个不同 ...

  5. Arcgis for JS之Cluster聚类分析的实现

    原文:Arcgis for JS之Cluster聚类分析的实现 在做项目的时候,碰见了这样一个问题:给地图上标注点对象,数据是从数据库来 的,包含XY坐标信息的,通过graphic和graphicla ...

  6. Internal Server Error500

    开启#LoadModule rewrite_module modules/mod_rewrite.so

  7. JQuery:JQuery语法、选择器、事件处理

    JQuery语法:   通过 jQuery,您可以选取(查询,query) HTML 元素,并对它们执行"操作"(actions). 一.语法:jQuery 语法是通过选取 HTM ...

  8. SqlServer基础:约束

    为了减少输入错误和保证数据库数据的完整性,可以对字段设置约束,例如考试成绩,其范围应该为0-100.约束是为了保证数据的完整性而实现的一套机制,约束包括:主键约束.外键约束.Unique约束.Chec ...

  9. Apache配置文件httpd.conf内容翻译

      本文已经废弃,现在apache2不依靠httpd.conf来配置. Ubuntu下默认的配置文件是/etc/apache2/sites-available/default 可以修改上面文件来修改a ...

  10. Java 多态 虚方法

    Java中多态的实现方式:接口实现,继承父类进行方法重写,同一个类中进行方法重载. 看代码: package com.company; public class Main { public stati ...