一. 管道输入/输出流

它和其它文件输入/输出流或网络输入/输出流的不同之处,它主要是线程之间的数据传输,而传输的媒介是内存。

管道输入/输出流主要包含四中实现:

1. PipedOutputStream, PipedInputStream 面向字节

2. PipedWriter, PipedReader 面向字符

对于Piped类型的流,必须向要进行绑定,需要调用connect()方法,如果没有将输入输出流绑定起来,对于该流的访问会报异常。

package com.bochao.concurrent;

import java.io.IOException;
import java.io.PipedReader;
import java.io.PipedWriter; public class Piped { static class Print implements Runnable { private PipedReader in; public Print(PipedReader in) {
this.in = in;
} @Override
public void run() {
int receive = 0;
try {
while ((receive = in.read()) != -1) {
System.out.print((char)receive);
}
} catch (IOException e) {
e.printStackTrace();
}
}
} public static void main(String[] args) { PipedWriter pipedWriter = new PipedWriter();
PipedReader pipedReader = new PipedReader();
try {
pipedWriter.connect(pipedReader);
} catch (IOException e) {
e.printStackTrace();
} // 启动打印线程
Thread thread = new Thread(new Print(pipedReader), "PrintThread");
thread.start(); //
int receive = 0;
try {
while ((receive = System.in.read()) != -1) {
pipedWriter.write(receive);
}
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
pipedWriter.close();
pipedReader.close();
} catch (IOException e) {
e.printStackTrace();
}
} }
}

二. Thread.join的使用

假设一个线程A调用了thread.join语句,其含义时当前线程A等待thread线程终止之后才从thread.join返回。

package com.bochao.concurrent;

import java.util.concurrent.TimeUnit;

public class Join {

	static class Domino implements Runnable{

		private Thread thread;

		public Domino(Thread thread){
this.thread = thread;
} @Override
public void run() { try {
thread.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName() + " terminate.");
}
} public static void main(String[] args) throws InterruptedException { Thread previous = Thread.currentThread();
for(int i = 0; i<10; i++){
Thread thread = new Thread(new Domino(previous), String.valueOf(i));
thread.start();
// 接力
previous = thread;
}
TimeUnit.SECONDS.sleep(5);
System.out.println(Thread.currentThread().getName() + " terminate.");
}
}

三. ThreadLocal 的使用

即线程变量,是一个以ThreadLocal对象为键,任意对象为值得存储结构。这个对象被附带在线程上,也就是说一个线程可以根据一个ThreadLocal对象查询到绑定在这个线程上的一个值。

通过set(T) 设置一个值,在通过get()方法获取到原先设置的值。

package com.bochao.concurrent;

import java.util.concurrent.TimeUnit;

public class Profiler {

	// 第一次get()方法调用时会进行初始化(如果set()方法没有调用),每个线程会调用一次
private static final ThreadLocal<Long> TIME_THREADLOCAL = new ThreadLocal<Long>(){ @Override
protected Long initialValue() {
return System.currentTimeMillis();
}
}; public static final void begin(){
TIME_THREADLOCAL.set(System.currentTimeMillis());
} public static final long end(){
return System.currentTimeMillis() - TIME_THREADLOCAL.get();
} public static void main(String[] args) throws InterruptedException {
Profiler.begin();
TimeUnit.SECONDS.sleep(2);
System.out.println("Cost: " + Profiler.end() + " mills!");
} }

Java多线程基础知识(三)的更多相关文章

  1. Java 多线程——基础知识

    java 多线程 目录: Java 多线程——基础知识 Java 多线程 —— synchronized关键字 java 多线程——一个定时调度的例子 java 多线程——quartz 定时调度的例子 ...

  2. Java 多线程基础(三) start() 和 run()

    Java 多线程基础(三) start() 和 run() 通过之前的学习可以看到,创建多线程过程中,最常用的便是 Thread 类中的 start() 方法和线程类的 run() 方法.两个方法都包 ...

  3. Java多线程基础知识笔记(持续更新)

    多线程基础知识笔记 一.线程 1.基本概念 程序(program):是为完成特定任务.用某种语言编写的一组指令的集合.即指一段静态的代码,静态对象. 进程(process):是程序的一次执行过程,或是 ...

  4. Java多线程基础知识总结

    2016-07-18 15:40:51 Java 多线程基础 1. 线程和进程 1.1 进程的概念 进程是表示资源分配的基本单位,又是调度运行的基本单位.例如,用户运行自己的程序,系统就创建一个进程, ...

  5. Java多线程基础知识篇

    这篇是Java多线程基本用法的一个总结. 本篇文章会从一下几个方面来说明Java多线程的基本用法: 如何使用多线程 如何得到多线程的一些信息 如何停止线程 如何暂停线程 线程的一些其他用法 所有的代码 ...

  6. JAVA多线程基础知识(一)

    一. 基础知识 要了解多线程首先要知道一些必要的概念,如进程,线程等等.开发多线程的程序有利于充分的利用系统资源(CPU资源),使你的程序执行的更快,响应更及时. 1. 进程,一般是指程序或者任务的执 ...

  7. Java多线程基础知识总结笔记

    本篇笔记记录一些在Java多线程编程中常见的关键字,比较简单和基础的就不写太详细了. 一.Thread类(其实也是应用了Runnable接口)和Runnable接口(只有一个run方法,应用该类必须重 ...

  8. Java多线程基础知识例子

    一.管理 1.创建线程 Thread public class Main { public static void main(String[] args) { MyThread myThread = ...

  9. Java多线程基础知识(二)

    一. Java线程具有6种状态  NEW 初始状态,线程被创建,但是还没有调用start方法. RUNNABLE 运行状态,java线程将操作系统中的就绪和运行两种状态笼统的称作进行中. BLOCKE ...

随机推荐

  1. Django中Celery的实现介绍(一)

    Django中Celery的实现 Celery官网http://www.celeryproject.org/ 学习资料:http://docs.jinkan.org/docs/celery/ Cele ...

  2. Git / 程序员需要知道的12个Git高级命令

    众所周知,Git目前已经是分布式版本控制领域的翘楚,围绕着Git形成了完整的生态圈.学习Git,首先当然是学习Git的基本工作流.相比于SVN等传统版本控制系统来说,Git是专为分布式版本控制而生的强 ...

  3. 将字符串转化为数字(Convert和Parse的用法)

    字符串必须是数字,不要超过转换成目标数字类型的范围.超过的话系统也会报错(溢出). static void Main(string[] args) { string s; int i; Console ...

  4. WinForm------给GridControl添加搜索功能

    //按钮点击事件 private void Btn_Search_Click(object sender, EventArgs e) { //获取编辑框的值 string text = this.te ...

  5. win8启动文件夹

    进入C:\ProgramData\Microsoft\Windows\Start Menu\Programs\StartUp.鼠标右键选中粘贴,将软件快捷方式粘贴到启动目录 进入文件夹时路径可能是C: ...

  6. web页面的加载顺序

    1.页面顺序 一个典型的web页面由于三个部分组成:html.css和JS.执行的顺序是: 在构造完HTML的dom结构时.触发DOMContentLoaded事件. 整个执行过程安装html的顺序来 ...

  7. live555编译、移植

    1.windows下编译 转 http://www.cnblogs.com/skyseraph/archive/2012/04/11/2442840.html 2.linux下编译,以及交叉编译,海思 ...

  8. GPRS/3G

    像GPRS/3G模块之类的应用,需要连接,登陆,初始化等步骤完成后才能传输数据,而这些步骤又比较耗时. 所以用 状态机 + 超时 的机制来实现比较合理. 如下代码片段来描述数据透传 : 状态机 + 超 ...

  9. 轻取帝国CMS管理员密码

    “帝国”CMS是一套著名的PHP整站程序,是国内使用人数最多的PHPCMS程序之一.令人无奈的是,“帝国”虽然把势力壮大了,却忽略了自身防护的建设,结果在黑客攻击下,“帝国”沦陷了.“帝国”CMS曝出 ...

  10. C++基础入门

    #include "iostream" using namespace std; class A{ public:      A(int x1){       x = x1;  } ...