java多线程基础
多线程基础
读书练习照猫画虎
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多线程基础的更多相关文章
- [转]Java多线程干货系列—(一)Java多线程基础
Java多线程干货系列—(一)Java多线程基础 字数7618 阅读1875 评论21 喜欢86 前言 多线程并发编程是Java编程中重要的一块内容,也是面试重点覆盖区域,所以学好多线程并发编程对我们 ...
- Java多线程基础:进程和线程之由来
转载: Java多线程基础:进程和线程之由来 在前面,已经介绍了Java的基础知识,现在我们来讨论一点稍微难一点的问题:Java并发编程.当然,Java并发编程涉及到很多方面的内容,不是一朝一夕就能够 ...
- Java 多线程——基础知识
java 多线程 目录: Java 多线程——基础知识 Java 多线程 —— synchronized关键字 java 多线程——一个定时调度的例子 java 多线程——quartz 定时调度的例子 ...
- Java多线程--基础概念
Java多线程--基础概念 必须知道的几个概念 同步和异步 同步方法一旦开始,调用者必须等到方法调用返回后,才能执行后续行为:而异步方法调用,一旦开始,方法调用就立即返回,调用者不用等待就可以继续执行 ...
- Java多线程基础知识总结
2016-07-18 15:40:51 Java 多线程基础 1. 线程和进程 1.1 进程的概念 进程是表示资源分配的基本单位,又是调度运行的基本单位.例如,用户运行自己的程序,系统就创建一个进程, ...
- Java基础16:Java多线程基础最全总结
Java基础16:Java多线程基础最全总结 Java中的线程 Java之父对线程的定义是: 线程是一个独立执行的调用序列,同一个进程的线程在同一时刻共享一些系统资源(比如文件句柄等)也能访问同一个进 ...
- 1、Java多线程基础:进程和线程之由来
Java多线程基础:进程和线程之由来 在前面,已经介绍了Java的基础知识,现在我们来讨论一点稍微难一点的问题:Java并发编程.当然,Java并发编程涉及到很多方面的内容,不是一朝一夕就能够融会贯通 ...
- Java 多线程基础(一)基本概念
Java 多线程基础(一)基本概念 一.并发与并行 1.并发:指两个或多个事件在同一个时间段内发生. 2.并行:指两个或多个事件在同一时刻发生(同时发生). 在操作系统中,安装了多个程序,并发指的是在 ...
- Java 多线程基础(三) start() 和 run()
Java 多线程基础(三) start() 和 run() 通过之前的学习可以看到,创建多线程过程中,最常用的便是 Thread 类中的 start() 方法和线程类的 run() 方法.两个方法都包 ...
- Java 多线程基础(四)线程安全
Java 多线程基础(四)线程安全 在多线程环境下,如果有多个线程在同时运行,而这些线程可能会同时运行这段代码.程序每次运行结果和单线程运行的结果是一样的,而且其他的变量的值也和预期的是一样的,就是线 ...
随机推荐
- SoapUI中如何获取当前active环境
// Get the current selected Environment def activeEnv = testRunner.testCase.testSuite.project.getAct ...
- Nutch2.x
http://www.micmiu.com/opensource/nutch/nutch2x-tutorial/
- asp.net DataTable 修改列值
/// <summary> /// 修改数据表DataTable某一列的类型和记录值(正确步骤:1.克隆表结构,2.修改列类型,3.修改记录值,4.返回结果) /// </summa ...
- 10款html5开发工具,实用+好用
利用HTML5工具不仅可以帮助设计师和开发者创建更具吸引力的网站,还能增加网站的可用性和可访问性.本文收集了10款HTML5开发工具让你在网页中搭建特效.动画.视频.音频等诸多功能,为你节省更多开发时 ...
- 移动端1px
移动端不同尺寸设备dpi不同,会造成1px线条不同程度的缩放,可利用媒体查询device-pixel-ratio,进行不同情况匹配: @media(-webkit-min-device-pixel-r ...
- sql语句格式化数字(前面补0)、替换字符串
以下是详细分析: 1.select power(10,3)得到1000(即:10的3次方) 2.select cast(1000+33 as varchar) 将1000转换类型(即:将int转化成v ...
- docker 源码分析 六(基于1.8.2版本),Docker run启动过程
上一篇大致了解了docker 容器的创建过程,其实主要还是从文件系统的视角分析了创建一个容器时需要得建立 RootFS,建立volumes等步骤:本章来分析一下建立好一个容器后,将这个容器运行起来的过 ...
- 什么是 kNN 算法?
学习 machine learning 的最低要求是什么? 我发觉要求可以很低,甚至初中程度已经可以. 首先要学习一点 Python 编程,譬如这两本小孩子用的书:[1][2]便可. 数学方面 ...
- Javascript 事件对象(三)事件冒泡
事件流---事件冒泡取消冒泡:ev.cancelBubble=true ---事件捕获Ie下是没有的,在绑定事件中,标准下是有的 <!DOCTYPE HTML> <html> ...
- linux驱动之LCD
LCD程序步骤:1. 分配一个fb_info 2. 设置 3. 硬件相关的操作4. 注册 register_framebuffer 5.入口函数 6.出口函数 #include <linux/s ...