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 Runnable 
private 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 test 
public 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接口的方式创建线程的主要内容,如果未能解决你的问题,请参考以下文章

Java之多线程方式二(实现Runnable接口)

Java多线程系列--“基础篇” 线程创建的方式

为啥要实现Runnable接口,来实现多线程?把Thread作为父类则不能呢?

JAVA多线程继承Thread 与实现Runnable接口的相关疑问

java多线程

Java多线程runnable