
class MyThread extends Thread {
private int i = 0;
public void run() {
for (i = 0; i < 100; i++) {
System.out.println(Thread.currentThread().getName() + " " + i);
}
}
}
public class ThreadTest {
public static void main(String[] args) {
for (int i = 0; i < 100; i++) {
System.out.println(Thread.currentThread().getName() + " " + i);
if (i == 30) {
Thread myThread1 = new MyThread(); // 创建一个新的线程 myThread1 此线程进入新建状态
Thread myThread2 = new MyThread(); // 创建一个新的线程 myThread2 此线程进入新建状态
myThread1.start(); // 调用start()方法使得线程进入就绪状态
myThread2.start(); // 调用start()方法使得线程进入就绪状态
}
}
}
}class MyRunnable implements Runnable {
private int i = 0;
public void run() {
for (i = 0; i < 100; i++) {
System.out.println(Thread.currentThread().getName() + " " + i);
}
}
}
public class ThreadTest {
public static void main(String[] args) {
for (int i = 0; i < 100; i++) {public class ThreadTest {
public static void main(String[] args) {
for (int i = 0; i < 100; i++) {
System.out.println(Thread.currentThread().getName() + " " + i);
if (i == 30) {
Runnable myRunnable = new MyRunnable();
Thread thread = new MyThread(myRunnable);
thread.start();
}
}
}
}
class MyRunnable implements Runnable {
private int i = 0;
public void run() {
System.out.println("in MyRunnable run");
for (i = 0; i < 100; i++) {
System.out.println(Thread.currentThread().getName() + " " + i);
}
}
}
class MyThread extends Thread {
private int i = 0;
public MyThread(Runnable runnable){
super(runnable);
}
public void run() {
System.out.println("in MyThread run");
for (i = 0; i < 100; i++) {
System.out.println(Thread.currentThread().getName() + " " + i);
}
}
}Thread thread = new MyThread(myRunnable);public interface Runnable { public abstract void run();}public void run() { if (target != null) { target.run(); }}- 避免点继承的局限,一个类可以继承多个接口。
- 适合于资源的共享
public class ThreadTest {
public static void main(String[] args) {
Callable<Integer> myCallable = new MyCallable(); // 创建MyCallable对象
FutureTask<Integer> ft = new FutureTask<Integer>(myCallable); //使用FutureTask来包装MyCallable对象
for (int i = 0; i < 100; i++) {
System.out.println(Thread.currentThread().getName() + " " + i);
if (i == 30) {
Thread thread = new Thread(ft); //FutureTask对象作为Thread对象的target创建新的线程
thread.start(); //线程进入到就绪状态
}
}
System.out.println("主线程for循环执行完毕..");
try {
int sum = ft.get(); //取得新创建的新线程中的call()方法返回的结果
System.out.println("sum = " + sum);
} catch (InterruptedException e) {
e.printStackTrace();
} catch (ExecutionException e) {
e.printStackTrace();
}
}
}
class MyCallable implements Callable<Integer> {
private int i = 0;
// 与run()方法不同的是,call()方法具有返回值
public Integer call() {
int sum = 0;
for (; i < 100; i++) {
System.out.println(Thread.currentThread().getName() + " " + i);
sum += i;
}
return sum;
}
}public class FutureTask<V> implements RunnableFuture<V> { //....}
public interface RunnableFuture<V> extends Runnable, Future<V> { void run();}public class ThreadTest {
public static void main(String[] args) {
MyRunnable myRunnable = new MyRunnable();
Thread thread = new Thread(myRunnable);
for (int i = 0; i < 100; i++) {
System.out.println(Thread.currentThread().getName() + " " + i);
if (i == 30) {
thread.start();
}
if(i == 40){
myRunnable.stopThread();
}
}
}
}
class MyRunnable implements Runnable {
private boolean stop;
public void run() {
for (int i = 0; i < 100 && !stop; i++) {
System.out.println(Thread.currentThread().getName() + " " + i);
}
}
public void stopThread() {
this.stop = true;
}
}public class Test {
public static void main(String[] args) {
Godown godown = new Godown(30);
Consumer c1 = new Consumer(50, godown);
Consumer c2 = new Consumer(20, godown);
Consumer c3 = new Consumer(10, godown);
Producer p1 = new Producer(10, godown);
Producer p2 = new Producer(10, godown);
Producer p3 = new Producer(10, godown);
Producer p4 = new Producer(10, godown);
Producer p5 = new Producer(10, godown);
Producer p6 = new Producer(10, godown);
Producer p7 = new Producer(80, godown);
c1.start();
c2.start();
c3.start();
p1.start();
p2.start();
p3.start();
p4.start();
p5.start();
p6.start();
p7.start();
}
}
/**
* @author dong
*
*/
class Godown {
public static final int MAX_SIZE = 100;// 最大库存量
public int curnum;// 当前库存量
Godown() {
}
Godown(int curnum) {
this.curnum = curnum;
}
/**
* 生产指定数量的产品
*
* @param neednum
*/
public synchronized void produce(int neednum) {
// 测试是否需要产品
while (neednum + curnum > MAX_SIZE) {
System.out.println("要生产的产品数量为:" + neednum + "超过剩余库存量:" + (MAX_SIZE - curnum) + ",暂时不能执行生产任务!");
try {
// 当前的生产线程等待
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
// 满足生产条件,则进行生产,这里简单的更改当前库存量
curnum += neednum;
System.out.println("已经生产了" + neednum + "个产品,现库存量为:" + curnum);
// 唤醒在此对象监视器上的等待的所有线程
notifyAll();
}
/**
* 消费制定数量的产品
*
* @param neednum
*/
public synchronized void consume(int neednum) {
// 测试是否可以消费
while (curnum < neednum) {
try {
// 当前的生产线程等待
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
// 满足消费条件,则进行消费,这里简单的更改当前库存量
curnum -= neednum;
System.out.println("已经消费了:" + neednum + "个产品,现仓库储量为:" + curnum);
// 唤醒再次对象监视器上等待的所有线程
notifyAll();
}
}
/**
* 生产者
*
* @author dong
*
*/
class Producer extends Thread {
private int neednum;// 生产产品的数量
private Godown godown;// 仓库
Producer(int neednum, Godown godown) {
this.neednum = neednum;
this.godown = godown;
}
public void run() {
// 生产指定数量的产品
godown.produce(neednum);
}
}
/**
* 消费者
*
* @author dong
*/
class Consumer extends Thread {
private int neednum;//生产产品的数量
private Godown godown;//仓库
Consumer(int neednum, Godown godown) {
this.neednum = neednum;
this.godown = godown;
}
public void run() {
//消费制定数量的产品
godown.consume(neednum);
}
}void join() //等待该线程终止。
void join(long millis) //等待该线程终止的时间最长为 millis毫秒。
void join(long millis,int nanos) //等待该线程终止的时间最长为 millis毫秒 + nanos 纳秒。//线程1
boolean stop = false;
while(!stop){
doSomething();
}
//线程2
stop = true;import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
/**
* @param :Java线程:线程池
* @author dong 2017-07-10
*/
public class MyThread extends Thread{
public void run(){
System.out.println(Thread.currentThread().getName() + "正在执行。。。");
}
}
class Test{
public static void main(String[] args) {
//创建一个可重用固定线程数的线程池
ExecutorService pool = Executors.newFixedThreadPool(2);
//创建实现了Runnable接口对象,Thread对象当然也实现可Runnable接口
Thread t1 = new MyThread();
Thread t2 = new MyThread();
Thread t3 = new MyThread();
Thread t4 = new MyThread();
Thread t5 = new MyThread();
//将线程放入池中进行执行
pool.execute(t1);
pool.execute(t2);
pool.execute(t3);
pool.execute(t4);
pool.execute(t5);
//关闭线程池
pool.shutdown();
}
}ExecutorService pool = Executors.newFixedThreadPool(2);//创建一个使用单个worker线程的Executor,以无界队列方式来运行该线程
ExecutorService pool = Executors.newSingleThreadExecutor();ExecutorService pool = Executors.newFixedThreadPool(2);//创建一个可根据需要创建新线程的线程池,但是在以前构造的线程可用时将重用它们。
ExecutorService pool = Executors.newCachedThreadPool();public class Test1 {
public static void main(String[] args) {
DeadlockRisk1 dead = new DeadlockRisk1();
MyThread t1 = new MyThread(dead, 1, 2);
MyThread t2 = new MyThread(dead, 3, 4);
MyThread t3 = new MyThread(dead, 5, 6);
MyThread t4 = new MyThread(dead, 7, 8);
t1.start();
t2.start();
t3.start();
t4.start();
}
}
class MyThread extends Thread {
private DeadlockRisk1 dead;
private int a,b;
MyThread(DeadlockRisk1 dead, int a, int b) {
this.dead = dead;
this.a = a;
this.b = b;
}
@Override
public void run() {
dead.read();
dead.write(a, b);
}
}
class DeadlockRisk1 {
private static class Resource {
public int value;
}
private Resource resourceA = new Resource();
private Resource resourceB = new Resource();
public int read() {
synchronized (resourceA) {
System.out.println("read():" + Thread.currentThread().getName() + "获取了resourceA的锁!");
synchronized (resourceB) {
System.out.println("read():" + Thread.currentThread().getName() + "获取了resourceB的锁!");
return resourceB.value + resourceA.value;
}
}
}
public void write(int a, int b) {
synchronized (resourceA) {
System.out.println("write():" + Thread.currentThread().getName() + "获取到了resourceA的锁!");
synchronized (resourceB) {
System.out.println("write():" + Thread.currentThread().getName() + "获取到了resourceB的锁!");
resourceA.value = a;
resourceB.value = b;
}
}
}
}Condition | Condition将Object监视器方法(wait、notify和 notifyAll)分解成截然不同的对象,以便通过将这些对象与任意Lock实现组合使用,为每个对象提供多个等待 set(wait-set)。 |
Lock | Lock实现提供了比使用synchronized方法和语句可获得的更广泛的锁定操作。 |
ReadWriteLock | ReadWriteLock维护了一对相关的锁定,一个用于只读操作,另一个用于写入操作。 |
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
/**
* @author dong
* @function Java线程:锁
*/
public class Test {
public static void main(String[] args) {
//创建并发访问的账户
MyCount myCount = new MyCount("11111111111111", 1000);
//创建一个锁对象
Lock lock = new ReentrantLock();
//创建一个线程池
ExecutorService pool = Executors.newCachedThreadPool();
//创建一些并发访问用户,一个信用卡,存的存,取的取
User u1 = new User("A", myCount, -400, lock);
User u2 = new User("B", myCount, 400, lock);
User u3 = new User("C", myCount, -600, lock);
User u4 = new User("D", myCount, 100, lock);
//在线程池中执行各个用户的操作
pool.execute(u1);
pool.execute(u2);
pool.execute(u3);
pool.execute(u4);
//关闭线程池
pool.shutdown();
}
}
/**
* 信用卡的用户
*/
class User implements Runnable {
private String name; //用户名
private MyCount myCount; //索要操作的账户
private int iocash; //操作的金额,当然有正负之分了
private Lock myLock; //执行操作所需要的锁对象
User (String name, MyCount myCount, int iocash, Lock myLock) {
this.name = name;
this.myCount = myCount;
this.iocash = iocash;
this.myLock = myLock;
}
public void run() {
//获取锁
myLock.lock();
//执行现金业务
System.out.println(name + "正在操作" + myCount + "账户,金额为" +
iocash + ",当前金额为" + myCount.getCash());
myCount.setCash(myCount.getCash() + iocash);
System.out.println(name + "操作" + myCount + "账户成功,金额为" +
iocash + ",当前金额为" + myCount.getCash());
//释放锁,否则别的线程就没有机会了
myLock.unlock();
}
}
/**
*信用卡账户,可随意透支
*/
class MyCount {
private String oid; //账号
private int cash; //账户余额
MyCount (String oid, int cash) {
this.oid = oid;
this.cash = cash;
}
public String getOid() {
return oid;
}
public void setOid(String oid) {
this.oid = oid;
}
public int getCash () {
return cash;
}
public void setCash(int cash) {
this.cash = cash;
}
public String toString() {
return "MyCount {" +
"oid='" + oid + '\'' +
", cash=" + cash +
'}';
}
}import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.locks.ReadWriteLock;
import java.util.concurrent.locks.ReentrantReadWriteLock;
/**
* @author dong
* @function Java线程:锁
*/
public class Test {
public static void main(String[] args) {
//创建并发访问的账户
MyCount myCount = new MyCount("11111111111111", 1000);
//创建一个锁对象
ReadWriteLock lock = new ReentrantReadWriteLock();
//创建一个线程池
ExecutorService pool = Executors.newFixedThreadPool(2);
//创建一些并发访问用户,一个信用卡,存的存,取的取
User u1 = new User("A", myCount, -400, lock, false);
User u2 = new User("B", myCount, 400, lock, false);
User u3 = new User("C", myCount, -600, lock, false);
User u4 = new User("D", myCount, 100, lock, false);
User u5 = new User("B", myCount, 0, lock, true);
//在线程池中执行各个用户的操作
pool.execute(u1);
pool.execute(u2);
pool.execute(u3);
pool.execute(u4);
pool.execute(u5);
//关闭线程池
pool.shutdown();
}
}
/**
* 信用卡的用户
*/
class User implements Runnable {
private String name; //用户名
private MyCount myCount; //索要操作的账户
private int iocash; //操作的金额,当然有正负之分了
private ReadWriteLock myLock; //执行操作所需要的锁对象
private boolean ischeck; //是否查询
User (String name, MyCount myCount, int iocash, ReadWriteLock myLock, boolean ischeck) {
this.name = name;
this.myCount = myCount;
this.iocash = iocash;
this.myLock = myLock;
this.ischeck = ischeck;
}
public void run() {
if (ischeck) {
//获取读锁
myLock.readLock().lock();
System.out.println("读: " + name + "正在查询" + myCount + "账户,当前金额为" + myCount.getCash());
//释放读锁
myLock.readLock().unlock();
} else {
//获取写锁
myLock.writeLock().lock();
//执行现金业务
System.out.println("写: " + name + "正在操作" + myCount + "账户,金额为" +
iocash + ",当前金额为" + myCount.getCash());
myCount.setCash(myCount.getCash() + iocash);
System.out.println("写: " + name + "操作" + myCount + "账户,当前金额为" + myCount.getCash());
//释放写锁
myLock.writeLock().unlock();
}
}
}
/**
*信用卡账户,可随意透支
*/
class MyCount {
private String oid; //账号
private int cash; //账户余额
MyCount (String oid, int cash) {
this.oid = oid;
this.cash = cash;
}
public String getOid() {
return oid;
}
public void setOid(String oid) {
this.oid = oid;
}
public int getCash () {
return cash;
}
public void setCash(int cash) {
this.cash = cash;
}
public String toString() {
return "MyCount {" +
"oid='" + oid + '\'' +
", cash=" + cash +
'}';
}
}import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Semaphore;
/**
* @author dong 2017-07-10
* @function Java线程:信号量
*/
public class Test {
public static void main(String[] args) {
MyPool myPool = new MyPool(20);
//创建线程池
ExecutorService threadPool = Executors.newFixedThreadPool(2);
MyThread t1 = new MyThread("任务A", myPool, 3);
MyThread t2 = new MyThread("任务B", myPool, 12);
MyThread t3 = new MyThread("任务C", myPool, 7);
//在线程池中执行任务
threadPool.execute(t1);
threadPool.execute(t2);
threadPool.execute(t3);
//关闭池
threadPool.shutdown();
}
}
/**
* 一个线程池
*/
class MyPool {
private Semaphore sp; //池相关的信号量
/**
* 池的大小,这个大小会传递给信号量
* @param size 池的大小
*/
MyPool(int size) {
this.sp = new Semaphore(size);
}
public Semaphore getSp() {
return sp;
}
public void setSp(Semaphore sp) {
this.sp = sp;
}
}
/**
*信用卡账户,可随意透支
*/
class MyThread extends Thread {
private String threadname; //线程的名称
private MyPool pool; //自定义池
private int x; //申请信号量的大小
MyThread(String threadname, MyPool pool, int x) {
this.threadname = threadname;
this.pool = pool;
this.x = x;
}
public void run() {
try {
//从此信号量获取给定数目的许可
pool.getSp().acquire(x);
//todo: 也许这里可以做更复杂的业务
System.out.println(threadname + "成功获取了" + x + "个许可!");
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
//释放给定数目的许可,将其返回到信号量。
pool.getSp().release(x);
System.out.println(threadname + "释放了" + x + "个许可!");
}
}
}import java.util.concurrent.BlockingQueue;
import java.util.concurrent.ArrayBlockingQueue;
/**
* @author dong 2017-07-11
* @function Java线程:阻塞队列
*/
public class Test {
public static void main(String[] args) throws InterruptedException {
BlockingQueue bqueue = new ArrayBlockingQueue(20);
for (int i = 0; i < 30; i++) {
//将指定元素添加到此队列中,如果没有可用空间,将一直等待(如果有必要)。
try {
bqueue.put(i);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("向阻塞队列中添加了元素:" + i);
}
System.out.println("程序到此运行结束,即将推出---");
}
}/**
* java线程:条件变量
* @author dong
*
*/
public class test6 {
public static void main(String[] args) {
//创建并发访问的账户
MyCount2 myCount = new MyCount2("123456", 10000);
//创建一个线程池
ExecutorService pool = Executors.newFixedThreadPool(2);
Thread t1 = new SavaThread("张三", myCount, 3600);
Thread t2 = new DrawThread("李四", myCount, 2700);
Thread t3 = new SavaThread("王五", myCount, 600);
Thread t4 = new DrawThread("老张", myCount, 1300);
Thread t5 = new SavaThread("老牛", myCount, 500);
Thread t6 = new SavaThread("胖子", myCount, 800);
//执行各个线程
pool.execute(t1);
pool.execute(t2);
pool.execute(t3);
pool.execute(t4);
pool.execute(t5);
pool.execute(t6);
//关闭线程池
pool.shutdown();
}
}
/**
* 存款线程
*/
class SavaThread extends Thread {
private String name;//操作人
private MyCount2 myCount;//账户
private int x;//存款金额
public SavaThread(String name, MyCount2 myCount, int x) {
super();
this.name = name;
this.myCount = myCount;
this.x = x;
}
public void run() {
myCount.saving(x, name);
}
}
/**
* 取款线程类
*/
class DrawThread extends Thread {
private String name;//操作人
private MyCount2 myCount;//账户
private int x;//存款金额
public DrawThread(String name, MyCount2 myCount, int x) {
super();
this.name = name;
this.myCount = myCount;
this.x = x;
}
@Override
public void run() {
myCount.drawing(x, name);
}
}
/**
* 普通银行账户,不可透支
*/
class MyCount2 {
private String oid;//账号
private int cash;//账户余额
private Lock lock = new ReentrantLock();//账户锁
private Condition _sava = lock.newCondition();//存款条件
private Condition _draw = lock.newCondition();//取款条件
public MyCount2(String oid, int cash) {
super();
this.oid = oid;
this.cash = cash;
}
/**
* 存款
* @param x 操作金额
* @param name 操作人
*/
public void saving(int x, String name) {
lock.lock();//获取锁
if (x > 0) {
cash += x;//存款
System.out.println(name + "存款" + x + ",当前余额为:" + cash);
}
_draw.signalAll();//唤醒所有等待线程
lock.unlock();
}
/**
* 取款
* @param x 操作金额
* @param name 操作人
*/
public void drawing(int x, String name) {
lock.lock();//获取锁
try {
if (cash -x < 0) {
_draw.await();//阻塞取款操作
} else {
cash -= x;//取款
System.out.println(name + "取款:" + x + ",当前余额为:" + cash);
}
_sava.signalAll();//唤醒所有取款操作
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
lock.unlock();//释放锁
}
}
}
,
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
/**
* java线程:条件变量
* @author dong
*
*/
public class test6 {
public static void main(String[] args) {
//创建并发访问的账户
MyCount2 myCount = new MyCount2("123456", 10000);
//创建一个线程池
ExecutorService pool = Executors.newFixedThreadPool(2);
Thread t1 = new SavaThread("张三", myCount, 3600);
Thread t2 = new DrawThread("李四", myCount, 2700);
Thread t3 = new SavaThread("王五", myCount, 600);
Thread t4 = new DrawThread("老张", myCount, 1300);
Thread t5 = new SavaThread("老牛", myCount, 500);
Thread t6 = new SavaThread("胖子", myCount, 800);
//执行各个线程
pool.execute(t1);
pool.execute(t2);
pool.execute(t3);
pool.execute(t4);
pool.execute(t5);
pool.execute(t6);
//关闭线程池
pool.shutdown();
}
}
/**
* 存款线程
*/
class SavaThread extends Thread {
private String name;//操作人
private MyCount2 myCount;//账户
private int x;//存款金额
public SavaThread(String name, MyCount2 myCount, int x) {
super();
this.name = name;
this.myCount = myCount;
this.x = x;
}
public void run() {
myCount.saving(x, name);
}
}
/**
* 取款线程类
*/
class DrawThread extends Thread {
private String name;//操作人
private MyCount2 myCount;//账户
private int x;//存款金额
public DrawThread(String name, MyCount2 myCount, int x) {
super();
this.name = name;
this.myCount = myCount;
this.x = x;
}
@Override
public void run() {
myCount.drawing(x, name);
}
}
/**
* 普通银行账户,不可透支
*/
class MyCount2 {
private String oid;//账号
private int cash;//账户余额
private Lock lock = new ReentrantLock();//账户锁
private Condition _sava = lock.newCondition();//存款条件
private Condition _draw = lock.newCondition();//取款条件
public MyCount2(String oid, int cash) {
super();
this.oid = oid;
this.cash = cash;
}
/**
* 存款
* @param x 操作金额
* @param name 操作人
*/
public void saving(int x, String name) {
lock.lock();//获取锁
if (x > 0) {
cash += x;//存款
System.out.println(name + "存款" + x + ",当前余额为:" + cash);
}
_draw.signalAll();//唤醒所有等待线程
lock.unlock();
}
/**
* 取款
* @param x 操作金额
* @param name 操作人
*/
public void drawing(int x, String name) {
lock.lock();//获取锁
try {
if (cash -x < 0) {
_draw.await();//阻塞取款操作
} else {
cash -= x;//取款
System.out.println(name + "取款:" + x + ",当前余额为:" + cash);
}
_sava.signalAll();//唤醒所有取款操作
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
lock.unlock();//释放锁
}
}
}/**
* java线程:不用条件变量
* @author dong
*
*/
public class test7 {
public static void main(String[] args) {
//创建并发访问的账户
MyCount3 myCount = new MyCount3("123456", 10000);
//创建一个线程池
ExecutorService pool = Executors.newFixedThreadPool(2);
Thread t1 = new SaveThread1("张三", myCount, 2000);
Thread t2 = new SaveThread1("李四", myCount, 3600);
Thread t3 = new DrawThread1("王五", myCount, 5000);
Thread t4 = new SaveThread1("老牛", myCount, 1100);
Thread t5 = new DrawThread1("老张", myCount, 1500);
//执行各个线程
pool.execute(t1);
pool.execute(t2);
pool.execute(t3);
pool.execute(t4);
pool.execute(t5);
//关闭线程池
pool.shutdown();
}
}
/**
* 存款线程
*/
class SaveThread1 extends Thread {
private String name;//操作人
private MyCount3 myCount;//账户
private int x;//存款金额
public SaveThread1(String name, MyCount3 myCount, int x) {
super();
this.name = name;
this.myCount = myCount;
this.x = x;
}
@Override
public void run() {
myCount.saving(x, name);
}
}
/**
* 取款线程
*/
class DrawThread1 extends Thread {
private String name;//操作人
private MyCount3 myCount;//账户
private int x;//存款金额
public DrawThread1(String name, MyCount3 myCount, int x) {
super();
this.name = name;
this.myCount = myCount;
this.x = x;
}
@Override
public void run() {
myCount.drawing(x, name);
}
}
/**
* 普通银行卡账户,不可透支
*/
class MyCount3 {
private String oid;//账号
private int cash;//账户余额
public MyCount3(String oid, int cash) {
super();
this.oid = oid;
this.cash = cash;
}
/**
* 存款
* @param x 操作金额
* @param name 操作金额
*/
public synchronized void saving(int x, String name) {
if (x > 0) {
cash += x;
System.out.println(name + "存款" + x + ",当前余额为:" + cash);
}
notifyAll();
}
/**
* 取款
* @param x 操作金额
* @param name 操作人
*/
public synchronized void drawing(int x, String name) {
if (cash - x < 0) {
try {
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
} else {
cash -= x;//取款
System.out.println(name + "取款" + x + "当前余额为:" + cash);
}
}
}/**
* java线程:不用条件变量,改为同步代码块
* @author dong
*
*/
public class test8 {
public static void main(String[] args) {
//创建并发访问的账户
MyCount3 myCount = new MyCount3("123456", 10000);
//创建一个线程池
ExecutorService pool = Executors.newFixedThreadPool(2);
Thread t1 = new SaveThread1("张三", myCount, 2000);
Thread t2 = new SaveThread1("李四", myCount, 3600);
Thread t3 = new DrawThread1("王五", myCount, 5000);
Thread t4 = new SaveThread1("老牛", myCount, 1100);
Thread t5 = new DrawThread1("老张", myCount, 1500);
//执行各个线程
pool.execute(t1);
pool.execute(t2);
pool.execute(t3);
pool.execute(t4);
pool.execute(t5);
//关闭线程池
pool.shutdown();
}
}
/**
* 存款线程
*/
class SaveThread2 extends Thread {
private String name;//操作人
private MyCount3 myCount;//账户
private int x;//存款金额
public SaveThread2(String name, MyCount3 myCount, int x) {
super();
this.name = name;
this.myCount = myCount;
this.x = x;
}
@Override
public void run() {
myCount.saving(x, name);
}
}
/**
* 取款线程
*/
class DrawThread2 extends Thread {
private String name;//操作人
private MyCount3 myCount;//账户
private int x;//存款金额
public DrawThread2(String name, MyCount3 myCount, int x) {
super();
this.name = name;
this.myCount = myCount;
this.x = x;
}
@Override
public void run() {
myCount.drawing(x, name);
}
}
/**
* 普通银行卡账户,不可透支
*/
class MyCount4 {
private String oid;//账号
private int cash;//账户余额
public MyCount4(String oid, int cash) {
super();
this.oid = oid;
this.cash = cash;
}
/**
* 存款
* @param x 操作金额
* @param name 操作金额
*/
public synchronized void saving(int x, String name) {
if (x > 0) {
synchronized (this) {
cash += x;//存款
System.out.println(name + "存款" + x + ",当前余额为:" + cash);
notifyAll();//唤醒所有等待的线程
}
}
}
/**
* 取款
* @param x 操作金额
* @param name 操作人
*/
public synchronized void drawing(int x, String name) {
synchronized (this) {
if (cash - x < 0) {
try {
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
} else {
cash -= x;//取款
System.out.println(name + "取款" + x + "当前余额为:" + cash);
}
notifyAll();//唤醒所有的存款操作
}
}
}public class test9 {
public static void main(String[] args) {
ExecutorService pool = Executors.newFixedThreadPool(2);
Lock lock = new ReentrantLock(false);
Runnable t1 = new MyRunnable3("张三", 2000, lock);
Runnable t2 = new MyRunnable3("李四", 3600, lock);
Runnable t3 = new MyRunnable3("王五", 2700, lock);
Runnable t4 = new MyRunnable3("老张", 600, lock);
Runnable t5 = new MyRunnable3("老牛", 1300, lock);
Runnable t6 = new MyRunnable3("胖子", 800, lock);
//执行各个线程
pool.execute(t1);
pool.execute(t2);
pool.execute(t3);
pool.execute(t4);
pool.execute(t5);
pool.execute(t6);
//关闭线程池
pool.shutdown();
}
}
class MyRunnable3 implements Runnable {
private static AtomicLong aLong = new AtomicLong(1000);//原子量,每个线程都可以自由操作
private String name; //操作人
private int x;//操作数额
private Lock lock;
public MyRunnable3(String name, int x, Lock lock) {
super();
this.name = name;
this.x = x;
this.lock = lock;
}
@Override
public void run() {
lock.lock();
System.out.println(x + "执行了" + x + ",当前余额为:" + aLong.addAndGet(x));
lock.unlock();
}
}/**
* java线程:障碍器
* @author dong
*
*/
public class test10 {
public static void main(String[] args) {
//创建障碍器,并设置MainTask为所有定数量的线程都达到障碍点的时候所要执行的任务(Runnable)
CyclicBarrier cb = new CyclicBarrier(7, new MainTask());
new SubTask("A", cb).start();
new SubTask("B", cb).start();
new SubTask("C", cb).start();
new SubTask("D", cb).start();
new SubTask("E", cb).start();
new SubTask("F", cb).start();
new SubTask("G", cb).start();
}
}
/**
* 主任务
*/
class MainTask implements Runnable {
@Override
public void run() {
System.out.println(">>>>>>主任务执行了<<<<<<<");
}
}
/**
*子任务
*/
class SubTask extends Thread {
private String name;
private CyclicBarrier cb;
public SubTask(String name, CyclicBarrier cb) {
super();
this.name = name;
this.cb = cb;
}
@Override
public void run() {
System.out.println("[子任务" + name + "]开始执行了!");
for (int i = 0; i < 99999; i++);//模拟耗时任务
System.out.println("[子任务" + name + "]开始执行完成了,并通过障碍器已经完成!");
try {
//通知障碍器已经完成
cb.await();
} catch (InterruptedException e) {
e.printStackTrace();
} catch (BrokenBarrierException e) {
e.printStackTrace();
}
}
}
689



被折叠的 条评论
为什么被折叠?



