多线程基础

读书练习照猫画虎

 package Threadtest;

 import java.util.Date;
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock; public class ThreadExerc {
public static void main(String[] args) throws Exception{
/*
* join
*/
// new JoinThread("new thread").start();
// for(int i=0; i<100; i++){
// if(i==20){
// JoinThread jt = new JoinThread("Joined Thread");
// jt.start();
// jt.join();
// }
// System.out.println(Thread.currentThread().getName()+"--"+i);
// }
/*
* sleep
*/
//testSleep(); /*
* yeild
*/
//testYeild(); /*
* 传统线程间通信
*/
// Account ac = new Account("123456", 0);
// new DrawThread("取钱者甲", ac, 1000).start();
// new DrawThread("取钱者乙", ac, 1000).start();
// new DrawThread("取钱者丙", ac, 1000).start();
// new DepositThread("存钱者A", ac, 1000).start();
// new DepositThread("存钱者B", ac, 1000).start();
// new DepositThread("存钱者C", ac, 1000).start();
//
/*
* 阻塞队列线程间通信---ArrayBlockingQueue
*/
BlockingQueue<String> bq = new ArrayBlockingQueue<>(5);
new Producer("工厂A", bq).start();
new Producer("工厂B",bq).start();
new Producer("工厂C",bq).start();
new Consumer("客户A",bq).start();
new Consumer("客户B",bq).start();
}
static void testSleep() throws Exception{
int i = 1;
while(i++<100){
System.out.println("Current Time is : "+ new Date());
Thread.sleep(10000);
} }
static void testYeild() {
class TestY extends Thread{
public TestY(String name){
super(name);
}
public void run(){
for(int i=0; i<100; i++){
System.out.println(getName() + "--" + i);
if(i==20) Thread.yield();
}
}
}
TestY t1 = new TestY("higher one");
TestY t2 = new TestY("lowwer one");
// t1.setPriority(Thread.MAX_PRIORITY);
// t2.setPriority(Thread.MIN_PRIORITY);
t1.start();
t2.start(); }
} class JoinThread extends Thread{
public JoinThread(String name){
super(name);
}
public void run(){
for(int i=0; i<100; i++){
System.out.println(getName()+"--"+i);
}
}
} class Account{
private String accountNo;
private double ballance;
private boolean flag = false;
private final Lock lock = new ReentrantLock();
private final Condition cond = lock.newCondition();
public Account(String accountNo, double ballance) {
super();
this.accountNo = accountNo;
this.ballance = ballance;
}
public String getAccountNo() {
return accountNo;
}
public void setAccountNo(String accountNo) {
this.accountNo = accountNo;
}
public double getBallance() {
return ballance;
}
// public synchronized void draw(double drawAmount){
public void draw(double drawAmount){
lock.lock();
try{
if(!flag ){
//wait();
cond.await();
}else{
System.out.println(Thread.currentThread().getName()+" 取钱: "+drawAmount);
ballance -= drawAmount;
System.out.println("余额:"+ballance);
flag = !flag;
//notifyAll();
cond.signalAll();
}
}catch(Exception e){
e.printStackTrace();
}finally{
lock.unlock();
}
}
// public synchronized void deposit(double depositAmount){
public void deposit(double depositAmount){
lock.lock();
try{
if(flag){
// wait();
cond.await();
}else{
System.out.println(Thread.currentThread().getName()+" 存钱: "+depositAmount);
ballance += depositAmount;
System.out.println("余额:"+ballance);
flag = !flag;
// notifyAll();
cond.signalAll();
}
}catch(Exception e){
e.printStackTrace();
}finally{
lock.unlock();
}
} }
class DrawThread extends Thread{
private Account ac;
private double drawAmount;
public DrawThread(String name , Account ac, double drawAmount){
super(name);
this.ac = ac;
this.drawAmount = drawAmount;
}
public void run(){
for(int i=0; i<100; i++){
ac.draw(drawAmount);
System.out.println(super.getName()+","+i);
}
}
}
class DepositThread extends Thread{
private Account ac;
private double depositAmount;
public DepositThread(String name , Account ac, double depositAmount){
super(name);
this.ac = ac;
this.depositAmount = depositAmount;
}
public void run(){
for(int i=0; i<100; i++){
ac.deposit(depositAmount);
System.out.println(super.getName()+","+i);
}
}
} //================================
class Producer extends Thread{
private BlockingQueue<String> bq; public Producer(String name, BlockingQueue<String> bq) {
super(name);
this.bq = bq;
}
public void run(){
String[] strArr = new String[]{
"java",
"Spring",
"struts",
"batis"
};
for(int i=0; i<1000; i++){
System.out.println(getName()+"生产者准备生产集合元素!");
try {
Thread.sleep(200);
bq.put(strArr[i%4]);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println(getName()+"生产者完成!"+bq);
}
}
}
class Consumer extends Thread{
private BlockingQueue<String> bq; public Consumer(String name, BlockingQueue<String> bq) {
super(name);
this.bq = bq;
}
public void run(){
while(true){
System.out.println(getName()+"消费者准备消费集合元素!");
try {
Thread.sleep(200);
bq.take();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println(getName()+"消费者完成!"+bq);
}
}
}

java多线程基础的更多相关文章

  1. [转]Java多线程干货系列—(一)Java多线程基础

    Java多线程干货系列—(一)Java多线程基础 字数7618 阅读1875 评论21 喜欢86 前言 多线程并发编程是Java编程中重要的一块内容,也是面试重点覆盖区域,所以学好多线程并发编程对我们 ...

  2. Java多线程基础:进程和线程之由来

    转载: Java多线程基础:进程和线程之由来 在前面,已经介绍了Java的基础知识,现在我们来讨论一点稍微难一点的问题:Java并发编程.当然,Java并发编程涉及到很多方面的内容,不是一朝一夕就能够 ...

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

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

  4. Java多线程--基础概念

    Java多线程--基础概念 必须知道的几个概念 同步和异步 同步方法一旦开始,调用者必须等到方法调用返回后,才能执行后续行为:而异步方法调用,一旦开始,方法调用就立即返回,调用者不用等待就可以继续执行 ...

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

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

  6. Java基础16:Java多线程基础最全总结

    Java基础16:Java多线程基础最全总结 Java中的线程 Java之父对线程的定义是: 线程是一个独立执行的调用序列,同一个进程的线程在同一时刻共享一些系统资源(比如文件句柄等)也能访问同一个进 ...

  7. 1、Java多线程基础:进程和线程之由来

    Java多线程基础:进程和线程之由来 在前面,已经介绍了Java的基础知识,现在我们来讨论一点稍微难一点的问题:Java并发编程.当然,Java并发编程涉及到很多方面的内容,不是一朝一夕就能够融会贯通 ...

  8. Java 多线程基础(一)基本概念

    Java 多线程基础(一)基本概念 一.并发与并行 1.并发:指两个或多个事件在同一个时间段内发生. 2.并行:指两个或多个事件在同一时刻发生(同时发生). 在操作系统中,安装了多个程序,并发指的是在 ...

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

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

  10. Java 多线程基础(四)线程安全

    Java 多线程基础(四)线程安全 在多线程环境下,如果有多个线程在同时运行,而这些线程可能会同时运行这段代码.程序每次运行结果和单线程运行的结果是一样的,而且其他的变量的值也和预期的是一样的,就是线 ...

随机推荐

  1. my vim

    set nu set cindent set smartindent set cursorline set showcmd set completeopt=preview,menu set autow ...

  2. play(1) 第一个简单的应用

    去年去了一家公司,公司要求要回使用play,所以在几天的时间内猛学习了一段时间play,发现play!有很多优点:简单,小巧,高开发效率,集成很多功能,容易调试.现在虽然已经不在那家公司,没有使用pl ...

  3. 【转】silverlight telerik RadGridView 列头显示其他控件

    <telerik:GridViewDataColumn DataMemberBinding="{Binding target_id}" IsFilterable=" ...

  4. Isolation-based Anomaly Detection

    Anomalies are data points that are few and different. As a result of these properties, we show that, ...

  5. iOS开发一个用户登录注册模块需要解决的坑

    最近和另外一位同事负责公司登录和用户中心模块的开发工作,开发周期计划两周,减去和产品和接口的协调时间,再减去由于原型图和接口的问题,导致强迫症纠结症状高发,情绪不稳定耗费的时间,能在两周基本完成也算是 ...

  6. Mvc api HelpPage 与注释

    一.添加包Microsoft.AspNet.WebApi.HelpPage可以自动给api生成帮助页面,url:/help 二.help加注释: 1. 2. public static class H ...

  7. jQuery中的$.grep()方法的使用

    标签: it 分类: jQuery grep()方法用于数组元素过滤筛选 grep(array,callback,invert) array:待过滤数组; callback:处理数组中的每个元素,并过 ...

  8. 用VC调用EXCEL简单代码(转载自越长大越孤单,觉得很好)

    首先在stdafx.h里加入对IDispatch接口提供支持的头文件: #include <afxDisp.h> 再在应用程序类的InitInstance()函数里加入: AfxOleIn ...

  9. 【LeetCode】Gray Code

    Gray Code The gray code is a binary numeral system where two successive values differ in only one bi ...

  10. 题目: 求1+2+...+n,要求不使用乘除发、for、while、if、else、switch、case、等关键字以及条件判断语句(A?B:C)

    #include <iostream> using namespace std; int add_(int a,int b){ return 0; } int Add(int i,bool ...