多线程基础

读书练习照猫画虎

 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. php session的操作

    [设置session数据] <?php session_start(); //初始化 //session文件中可以保存 dobule,integer,bool,array,object $_SE ...

  2. 将word文件快速转换成表格的技巧

    最近烦心事还真是很多,世界买家网最近就遇到了很多烦心事. 从www.buyerinfo.biz网站中的数据导出为csv格式的文件,我导出了buyer的数据,那怎么把它制作成表格呢? 找了下,发现还是比 ...

  3. 简单的ATM,见笑见笑

    #include<stdio.h>#include<string.h> void main(){  char a[4]={0}; char e[]="9527&quo ...

  4. 数据库:mongodb与关系型数据库相比的优缺点 (转)

    与关系型数据库相比,MongoDB的优点:①弱一致性(最终一致),更能保证用户的访问速度:举例来说,在传统的关系型数据库中,一个COUNT类型的操作会锁定数据集,这样可以保证得到“当前”情况下的精确值 ...

  5. MATLAB中白噪声的产生

    rand产生的是[0,1]上的均匀分布的随机序列randn产生均值为0,方差为1的高斯随机序列,也就是白噪声序列 rand产生的是均匀分布白噪声序列randn产生的是正态分布的白噪声序列 MATLAB ...

  6. PHP下使用强大的imagick轻松生成组合缩略图

    project: blog target: use-imagick-to-composite-images-thumbnail.md date: 2016-02-19 status: publish ...

  7. C#方法参数传递机制

    1:value(值传递).ref(引用传递).out(输出传递) ref和out使用效果上面是等效的,它们的区别在于:参数标记为ref,那么必须在调用函数之前初始化参数的值:参数标记为out,调用函数 ...

  8. Photoshop制作的海报修改~

    经过几天的征求意见,感觉还是要重新制作,于是把颜色删减了不少 . 这次运用了蒙版和渐变,但感觉效果不太好.再改.. 后来觉得给人的单身感有点少.. 不知道感觉如何,但自己觉得比以前好看..

  9. 让LinqToSQL使用Web.Config中的链接字符串(修改Settings.Designer.cs)

    [global::System.Configuration.ApplicationScopedSettingAttribute()] [global::System.Diagnostics.Debug ...

  10. JAVA Web day01--- Android小白的第一天学习笔记

    HTML 1.HTML的概述 1.1.HTML简介 l HTML(Hyper Text Markup Language):超文本标记语言. >标记就是标签 >HTML不是一种编程语言,而是 ...