JAVA多线程用实现Runnable接口的方式创建线程
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JAVA多线程用实现Runnable接口的方式创建线程相关的知识,希望对你有一定的参考价值。
问题:张三和他的妻子各拥有一张银行卡和存折,可以对同一个银行账户进行存取款的操作。现银行账户中余款为500元,每人各取款五次,每次取款100元,在取款过程中存在网络延时。要求使用多线程模拟这个过程。 提示:1、因两人共同操作同一账户,所以用实现Runnable接口的方式创建线程。 2、每次取100元,取款过程分为以下三步。 (1)检查账户余额是否足够。 (2)模拟0.5秒网络延时。 (3)如果余额足够,则修改余额,完成取款;如果余额不足,则提示相应信息; 3、取款过程中为保证线程安全,需要同步线程。 求JAVA代码
public class MuRun implements Runnableprivate String name;
public MuRun(String name)
this.name = name;
@Override
public void run()
synchronized(MuRun.class)
for(int i=0;i<5;i++)
if (test.money > 0)
test.money = test.money - 100;
System.out.println(name + "取走了100元");
else
System.out.println(name + "没钱了");
try
Thread.sleep(500);
catch (InterruptedException e)
e.printStackTrace();
调用:
Thread zf = new Thread(new MuRun("丈夫"));Thread qz = new Thread(new MuRun("妻子"));
zf.start();
qz.start();追问
代码不完整 可以提供一个完整的吗?
追答..上面的是完整的,你建一个类代码复制进去就是了,第二个放在main方法里面:
public class testpublic static int money = 500;
public static void main(String[] args)
Thread zf = new Thread(new MuRun("丈夫"));
Thread qz = new Thread(new MuRun("妻子"));
zf.start();
qz.start();
追问
你的代码不能实现上图的效果!
参考技术A package seven;public class MuRun extends Thread
private String name; // 姓名
private int money; // 卡剩余额
private int time; // 网络延迟
private boolean flag = false; // 记录是否还有余额
/**
* 重写Thread的run方法
*/
public void run()
while (!flag)
sale();
/**
* 有参构造
*
* @param name
* @param money
* @param time
*/
public MuRun(String name, int money, int time)
super(name);
this.money = money;
this.time = time;
/*
* 线程同步
*/
public synchronized void sale()
for(int i=0;i<10;i++)
if (money <= 0) // 卡里还有钱剩余就一直取
System.out.println("余额不足以支付" + Thread.currentThread().getName() + "的取款,余额为零!");
flag = true;
return;
money -= 100;
try
Thread.sleep(this.time); // 网络延迟
catch (InterruptedException e)
e.printStackTrace();
System.out.println(Thread.currentThread().getName() + "准备取款");
System.out.println(Thread.currentThread().getName() + "完成取款");
public class JianDa
public static void main(String[] args)
MuRun mu1 = new MuRun("张三",500,500);
MuRun mu2 = new MuRun("张三的妻子",500,500);
mu1.start();
mu2.start();
Java之多线程方式二(实现Runnable接口)
/**
* 创建多线程的方式二:实现Runnable接口
* 1. 创建一个实现了Runnable接口的类
* 2. 实现类去实现Runnable中的抽象方法:run()
* 3. 创建实现类的对象
* 4. 将此对象作为参数传递到Thread类的构造器中,创建Thread类的对象
* 5. 通过Thread类的对象调用start()
*
*
* 比较创建线程的两种方式。
* 开发中:优先选择:实现Runnable接口的方式
* 原因:1. 实现的方式没有类的单继承性的局限性
* 2. 实现的方式更适合来处理多个线程有共享数据的情况。
*
* 联系:public class Thread implements Runnable
* 相同点:两种方式都需要重写run(),将线程要执行的逻辑声明在run()中。
*
*/
//1. 创建一个实现了Runnable接口的类
class MThread implements Runnable{
//2. 实现类去实现Runnable中的抽象方法:run()
@Override
public void run() {
for (int i = 0; i < 100; i++) {
if(i % 2 == 0){
System.out.println(Thread.currentThread().getName() + ":" + i);
}
}
}
}
public class ThreadTest1 {
public static void main(String[] args) {
//3. 创建实现类的对象
MThread mThread = new MThread();
//4. 将此对象作为参数传递到Thread类的构造器中,创建Thread类的对象
Thread t1 = new Thread(mThread);
t1.setName("线程1");
//5. 通过Thread类的对象调用start():① 启动线程 ②调用当前线程的run()-->调用了Runnable类型的target的run()
t1.start();
//再启动一个线程,遍历100以内的偶数
Thread t2 = new Thread(mThread);
t2.setName("线程2");
t2.start();
}
}
以上是关于JAVA多线程用实现Runnable接口的方式创建线程的主要内容,如果未能解决你的问题,请参考以下文章
为啥要实现Runnable接口,来实现多线程?把Thread作为父类则不能呢?