文档章节

Java Thread

当空皓月
 当空皓月
发布于 2016/04/01 11:20
字数 872
阅读 61
收藏 3

1、Suspend, resume, and stop a thread:

  1.1 java 1.5之前的实现方式:

class MyThread implements Runnable {
  Thread thrd;  boolean suspended;  boolean stopped;

  MyThread(String name) {
    thrd = new Thread(this, name);
    suspended = false;
    stopped = false;
    thrd.start();
  } 
   public void run() {  
     try {     
      for (int i = 1; i < 10; i++) {
        System.out.print(".");
        Thread.sleep(50);     
           synchronized (this) {   
            while (suspended)
            wait();    
            if (stopped)
            break;
        }
      }
    } catch (InterruptedException exc) {
      System.out.println(thrd.getName() + " interrupted.");
    }
    System.out.println("\n" + thrd.getName() + " exiting.");
  }  
  synchronized void stop() {
    stopped = true;
    suspended = false;
    notify();
  }  
  synchronized void suspend() {
    suspended = true;
  } 
   synchronized void resume() {
    suspended = false;
    notify();
  }
}
public class Main {  
  public static void main(String args[]) throws Exception {
    MyThread mt = new MyThread("MyThread");
    Thread.sleep(100);
    mt.suspend();
    Thread.sleep(100);

    mt.resume();
    Thread.sleep(100);

    mt.suspend();
    Thread.sleep(100);

    mt.resume();
    Thread.sleep(100);

    mt.stop();
  }
}

原文地址:http://www.java2s.com/Tutorial/Java/0160__Thread/Suspendresumeandstopathread.htm

      1.2  java 1.5之后的实现方式:

用ReentrantLock,请参考ThreadPoolExecutor源代码中所提供的例子。很经典。

我的实现:

package com.io.test;

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.ReentrantLock;

public class C {

	/**
	 * @descreption:
	 * @param args
	 * @throws Exception
	 */
	public static void main(String[] args) throws Exception {

		MyRunnable myRunnable = new MyRunnable();
		ExecutorService executorService = Executors.newFixedThreadPool(1);
		executorService.execute(myRunnable);

		Thread.sleep(5000);
		//myRunnable.suspend();
		myRunnable.setSuspend(true);
		System.out.println("暂停5s...");
		Thread.sleep(5000);
		//myRunnable.resume();
		myRunnable.setSuspend(false);
		System.out.println("继续...");

	}

	public static class MyRunnable implements Runnable {

		/**
		 * 是否暂停
		 */
		private boolean isSuspend;
		private ReentrantLock lock;
		private Condition isSuspendCondition;

		MyRunnable() {
			lock = new ReentrantLock();
			isSuspendCondition = lock.newCondition();
		}

		@Override
		public void run() {
			for (int i = 0; i < 50; i++) {
				lock.lock();
				try {
					if (isSuspend) {
						isSuspendCondition.await();
					}
					System.out.println(i);
					Thread.sleep(1000);
				} catch (Exception e) {
				} finally {
					lock.unlock();
				}
			}
		}

		public void setSuspend(boolean isSuspend) {
			lock.lock();
			try {
				this.isSuspend = isSuspend;
				if (!isSuspend) {
					isSuspendCondition.signal();
				}
			} catch (Exception e) {

			} finally {
				lock.unlock();
			}
		}

		// 暂停
		public void suspend() {
			lock.lock();
			isSuspend = true;
			lock.unlock();
		}

		// 继续
		public void resume() {
			lock.lock();
			isSuspend = false;
			isSuspendCondition.signal();
			lock.unlock();
		}

	}
}

运行效果:

0

1

2

3

4

5

6

7

8

9

暂停5s...

继续...

10

11

12

13

14

15

16

17

18

2、先让A线程输出1,2,3,4,再让B线程输出A,B,C,D,如此循环往复5次。

package com.io.test;

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.ReentrantLock;

public class Test {
	private static int count = 1;
	private static ReentrantLock lock;
	private static Condition jiCondition;
	private static Condition ouCondition;

	/**
	 * @descreption:
	 * @param args
	 */
	public static void main(String[] args) {

		lock = new ReentrantLock();
		jiCondition = lock.newCondition();
		ouCondition = lock.newCondition();

		ExecutorService executorService = Executors.newFixedThreadPool(2);
		executorService.execute(new A());
		executorService.execute(new B());
	}

	public static class A implements Runnable {

		@Override
		public void run() {
			lock.lock();
			try {
				while(count<=10)
				{
					if (count % 2 != 0) {// 奇数
						aWorking();
						count++;
						System.out.println("==========线程1 唤醒 线程2==========");
						ouCondition.signal();
					}else {
						System.out.println("==========线程1 await==========");
						jiCondition.await();
					}
					
				}
			} catch (InterruptedException e) {
				e.printStackTrace();
			} finally {
				lock.unlock();
			}
		}
	}

	public static class B implements Runnable {

		@Override
		public void run() {
			lock.lock();
			try {
				while(count<=10)
				{
					if (count % 2 != 0) {// 奇数
						System.out.println("==========线程2 await==========");
						ouCondition.await();
					}else {
						bWorking();
						count++;
						System.out.println("==========线程2 唤醒 线程1==========");
						jiCondition.signal();
					}
					
				}
			} catch (InterruptedException e) {
				e.printStackTrace();
			} finally {
				lock.unlock();
			}
		}
	}

	private static void aWorking() {
		for (int i = 1; i <= 4; i++) {
			System.out.println(i);
		}
		System.out.println("==========线程1 over==========");
	}

	private static void bWorking() {
		for (char i = 'A'; i <= 'D'; i++) {
			System.out.println(i);
		}
		System.out.println("==========线程2 over==========");
	}

}

运行效果:

1

2

3

4

==========线程1 over==========

==========线程1 唤醒 线程2==========

==========线程1 await==========

A

B

C

D

==========线程2 over==========

==========线程2 唤醒 线程1==========

==========线程2 await==========

1

2

3

4

==========线程1 over==========

==========线程1 唤醒 线程2==========

==========线程1 await==========

A

B

C

D

==========线程2 over==========

==========线程2 唤醒 线程1==========

==========线程2 await==========

1

2

3

4

==========线程1 over==========

==========线程1 唤醒 线程2==========

==========线程1 await==========

A

B

C

D

==========线程2 over==========

==========线程2 唤醒 线程1==========

==========线程2 await==========

1

2

3

4

==========线程1 over==========

==========线程1 唤醒 线程2==========

==========线程1 await==========

A

B

C

D

==========线程2 over==========

==========线程2 唤醒 线程1==========

==========线程2 await==========

1

2

3

4

==========线程1 over==========

==========线程1 唤醒 线程2==========

==========线程1 await==========

A

B

C

D

==========线程2 over==========

==========线程2 唤醒 线程1==========

2、线程池中的线程执行顺序

ExecutorService pool = Executors.newFixedThreadPool(10);
for (int i = 0; i < len; i++) {        
pool.execute(new Before());
pool.execute(new MyThread());
pool.execute(new After());
} 如何让pool中的三个线程按顺序执行?谢谢

解决办法1:用Executors.newSingleThreadPool

解决办法2:用ThreadPoolExecutor,其中BlockQueue使用LinkedBlockingQueue(此队列按 FIFO(先进先出)排序元素)。

注意:

1、必须要使用take()方法在获取的时候达成阻塞结果
2、使用poll()方法将产生非阻塞效果

http://www.cnblogs.com/starcrm/p/4998067.html 

© 著作权归作者所有

上一篇: Android LogCat
下一篇: Android ImageView
当空皓月
粉丝 14
博文 179
码字总数 67070
作品 0
郑州
私信 提问

暂无文章

面试官,Java8 JVM内存结构变了,永久代到元空间

在文章《JVM之内存结构详解》中我们描述了Java7以前的JVM内存结构,但在Java8和以后版本中JVM的内存结构慢慢发生了变化。作为面试官如果你还不知道,那么面试过程中是不是有些露怯?作为面试...

程序新视界
8分钟前
7
0
读书笔记:深入理解ES6 (八)

第八章 迭代器(Iterator)与生成器(Generator) 第1节 循环语句的问题   在循环、多重循环中,通过变量来跟踪数组索引的行为容易导致程序出错。迭代器的出现旨在消除这种复杂性,并减少循...

张森ZS
8分钟前
6
0
Elasticsearch 实战(一) - 简介

官腔 Elasticsearch,分布式,高性能,高可用,可伸缩的搜索和分析系统 基本等于没说,咱们慢慢看 1 概述 百度:我们比如说想找寻任何的信息的时候,就会上百度去搜索一下,比如说找一部自己喜...

JavaEdge
12分钟前
3
0
【jQuery基础学习】11 jQuery性能简单优化

本文转载于:专业的前端网站➦【jQuery基础学习】11 jQuery性能简单优化 关于性能优化 合适的选择器 $("#id")会直接调用底层方法,所以这是最快的。如果这样不能直接找到,也可以用find方法继...

前端老手
21分钟前
5
0
重磅发布 | 全球首个云原生应用标准定义与架构模型 OAM 正式开源

导读:2019 年 10 月 17 日,阿里巴巴合伙人、阿里云智能基础产品事业部总经理蒋江伟(花名:小邪)在 Qcon 上海重磅宣布,阿里云与微软联合推出开放应用模型 Open Application Model (OAM...

阿里云官方博客
24分钟前
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部