一. 管道输入/输出流

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

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

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. HBase与MongDB等NoSQL数据库对照

    HBase概念学习(十)HBase与MongDB等NoSQL数据库对照 转载请注明出处: jiq•钦's technical Blog - 季义钦 一.开篇 淘宝之前使用的存储层架构一直是MySQL数 ...

  2. git的基本操作

    今天给同事培训了一下git的使用流程,简单记录一下 1,基本概念, 远程库和本地库. 2, git clone git://url/*.git clone远程的代码库到本地 3. 创建本地分支 当前是 ...

  3. string length()

    #include <set> std::set<std::string> setName; int main() { std::string strName = "世 ...

  4. notification的使用

    示例: NotificationManager nm = (NotificationManager)getSystemService(Context.NOTIFICATION_SERVICE); No ...

  5. HTML+JS+DOM【选项卡自动切换】

    最终效果图(鼠标无操作会自动切换选项卡): <!DOCTYPE html> <html> <head> <meta charset="gb2312& ...

  6. python 选择排序

    选择排序算法的思想,首先第一次先从整个序列中选择最小的数,然后放到第一位,然后再从第二位到最后一位选择出最小的一个数,把这个数放到第二位,然后,再从第三位到最后一位选择其中最小的数放到第三位,这样一直 ...

  7. Centos7安装rabbitmq server 3.6.0

    ###假设所有操作在opt目录下进行 cd /opt mkdir apps cd apps ### 下载 RabbitMQ Server wget http://www.rabbitmq.com/re ...

  8. High Frequency Trading (整理中...)

    什么是高频交易系统 1 交易指令完全是由电脑发送,对市场数据的响应延时在微秒级2 系统有专用的软硬件组成,研发时需要大量的计算机专家级的工作3 系统的硬件需要放在离交易所主机很近的位置,所谓co-lo ...

  9. Python画图笔记

    matplotlib的官方网址:http://matplotlib.org/ 问题 Python Matplotlib画图,在坐标轴.标题显示这五个字符 ⊥ + - ⊺ ⨁,并且保存后也能显示   h ...

  10. git SSH keys

    An SSH key allows you to establish a secure connection between your computer and GitLab. Before gene ...