多线程基础

读书练习照猫画虎

 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. 解决小米wifi在windows10无法创建问题

    1.打开小米随身WIFI客户端安装文件夹(软件安装在那个盘,就在那个盘里找). 2.D:\Program Files (x86)\XiaoMi\MiWiFi\drivers\Win81x64(系统是3 ...

  2. SQL SERVER 字符串常用函数

    在开发T-SQL时,经常会需要对字符串进行各种各样的操作,下面介绍常用的字符串函数. 1.获取字符的ASCII码 ASCII ASCII码是对字符的标准编码.要获取字符的ASCII码就可以通过调用AS ...

  3. #HTML:無序、有序與定義清單

    #HTML:無序.有序與定義清單 Maplewing 于 星期六, 12/10/2013 - 09:48 提交 清單在網頁中是很常使用到的東西,故多少還是要了解一下.在HTML中有三種不太一樣的清單, ...

  4. logsatsh input 插件之 collectd

    logsatsh input 插件之 collectd 标签(空格分隔): logstash 作用:用于监控内存,cpu,磁盘I等信息 未完待续,时间未定. 参考: logstash 官网 elast ...

  5. Perl技巧

    项目里面一直用的是Perl,Perl里有各种小技巧就分享在这吧. push(@a, $b) 把b元素压入a数组中, 还可以有 push(@a, [@b]); 那a就成了二维数组了 scalar(@a) ...

  6. c++虚函数和内联构造函数

    创建一个含有虚函数的对象时, 编译器会实现 "初始化其VPTR以指向相应的VTABLE" 这个操作 ,而实现这个操作是通过 "插入隐藏代码至构造函数中" 故此时 ...

  7. 2014年6月份第2周51Aspx源码发布详情

    AMX高效自定义分页控件(WinForm)源码  2014-6-9 [VS2008]2014.6.9更新内容:   1. 更改用户自定义分页控件功能布局.大大精简了调用分页自定义控件的代码,和使用系统 ...

  8. 2014年6月份第1周51Aspx源码发布详情

    企业汽车服务终端管理系统源码  2014-6-3 [VS2010]源码描述:本系统专门服务于(汽车美容4s店) 完整的一套汽车美容管理服务系统. 功能介绍:汽车美容服务终端功能强大而又简便实用,界面友 ...

  9. :before :after

    CSS 有两个说不上常用的伪类 :before 和 :after,偶尔会被人用来添加些自定义格式什么的,但是它们的功用不仅于此.前几天发现了 Creative Link Effects 这个非常有意思 ...

  10. jsp九大内置对象和四大作用域

    看到网上一些Jsp内置对象介绍的都不是很全,今天我把各位大神的整理了一下. JSP九大对象:内置对象(又叫隐含对象,有9个内置对象):不需要预先声明就可以在脚本代码和表达式中随意使用. 一.reque ...