「java多线程通信」多线程通信和多进程通信

博主:adminadmin 2022-11-28 19:29:05 40

今天给各位分享java多线程通信的知识,其中也会对多线程通信和多进程通信进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!

本文目录一览:

java多线程的同步控制与线程间的通信

按照下面这个运行结果(最后两行顺序不一定):

小张 用 20 元买票

小孙 用 10 元买票

小孙 买到票并拿回 5 元

小赵 用 5 元买票

小赵 买到票并拿回 0 元

小张 买到票并拿回 15 元

public class Main {

public static void main(String[] args) {

try {

TicketSeller ts = new TicketSeller();

// 张某拿着1张20元的人民币排在第一,孙某拿着1张10元的人民币排在第二,赵某拿着1张5元的人民币排在第三。

TicketBuyer zhang = new TicketBuyer(ts, "小张", 20);

Thread tZhang = new Thread(zhang);

tZhang.start();

Thread.sleep(100); // 确保买票顺序

TicketBuyer sun = new TicketBuyer(ts, "小孙", 10);

Thread tSun = new Thread(sun);

tSun.start();

Thread.sleep(100);

TicketBuyer zhao = new TicketBuyer(ts, "小赵", 5);

Thread tZhao = new Thread(zhao);

tZhao.start();

} catch (InterruptedException ex) {

}

}

}

class TicketSeller{

//电影票5元一张

private static final int TICKET_PRICE = 5;

private int fiveNumber, tenNumber, twentyNumber;

public TicketSeller(){

//售票员只有1张5元的钱

fiveNumber = 1;

tenNumber = twentyNumber = 0;

}

public synchronized int sellTicket(int receiveMoney){

int changeRequired = receiveMoney - TICKET_PRICE;

while(!prepareChange(changeRequired)){

try {

this.wait();

} catch (InterruptedException ex) {

// Do nothing

}

}

switch(receiveMoney){

case 5: fiveNumber++; break;

case 10: tenNumber++; break;

case 20: twentyNumber++; break;

default: System.out.println("错误001");

}

this.notify();

return changeRequired;

}

/**

* 给出找钱

* @param changeRequired 需要找的钱数

* @return 是否能给出

*/

private boolean prepareChange(int changeRequired) {

switch(changeRequired){

case 0:

return true;

case 5:

if(fiveNumber = 1){

fiveNumber--;

return true;

}

break;

case 10:

// 找一张10元的

if(tenNumber = 1){

tenNumber--;

return true;

}

// 找两张5元的

if(fiveNumber = 2){

fiveNumber-=2;

return true;

}

break;

case 15:

// 找一张10元的+一张5元的

if(tenNumber = 1 fiveNumber = 1){

tenNumber--;

fiveNumber--;

return true;

}

// 找3张5元的

if(fiveNumber = 3){

fiveNumber-=3;

return true;

}

break;

}

return false;

}

}

class TicketBuyer implements Runnable{

private TicketSeller ts;

private int moneyAvailable;

private String myName;

public TicketBuyer(TicketSeller ts, String name, int moneyAvailable){

this.ts = ts;

this.myName = name;

this.moneyAvailable = moneyAvailable;

}

public void run() {

System.out.printf("%s 用 %d 元买票\r\n", this.myName, this.moneyAvailable);

int change = this.ts.sellTicket(this.moneyAvailable);

System.out.printf("%s 买到票并拿回 %d 元\r\n", this.myName, change);

}

}

java多线程socket通信原理是什么?

第一,程序是通过分时进行服务的。就是说一个程序监听一个端口,第一秒可以从别的地方来一个包,第二秒可以从另一个地方来一个包。

第二,每个socket都会有包发送来的ip地址和端口号,服务器向这个ip对应机器的端口发送数据以回应对方。

java多线程有几种实现方法

继承Thread类来实现多线程:

当我们自定义的类继承Thread类后,该类就为一个线程类,该类为一个独立的执行单元,线程代码必须编写在run()方法中,run方法是由Thread类定义,我们自己写的线程类必须重写run方法。

run方法中定义的代码为线程代码,但run方法不能直接调用,如果直接调用并没有开启新的线程而是将run方法交给调用的线程执行

要开启新的线程需要调用Thread类的start()方法,该方法自动开启一个新的线程并自动执行run方法中的内容

         

请点击输入图片描述

结果:            

         

请点击输入图片描述

*java多线程的启动顺序不一定是线程执行的顺序,各个线程之间是抢占CPU资源执行的,所有有可能出现与启动顺序不一致的情况。

CPU的调用策略:

如何使用CPU资源是由操作系统来决定的,但操作系统只能决定CPU的使用策略不能控制实际获得CPU执行权的程序。

线程执行有两种方式:

1.抢占式:

目前PC机中使用最多的一种方式,线程抢占CPU的执行权,当一个线程抢到CPU的资源后并不是一直执行到此线程执行结束,而是执行一个时间片后让出CPU资源,此时同其他线程再次抢占CPU资源获得执行权。

2.轮循式;

每个线程执行固定的时间片后让出CPU资源,以此循环执行每个线程执行相同的时间片后让出CPU资源交给下一个线程执行。

Java中线程间怎么通讯?什么叫僵死线程?

JAVA直接通信 一般有个servicer端 一个client端,servicer启动后,client与servicer连接,你可以试用UDP协议或者TCP/IP协议在多线程中,线程会sleep,当程序停止时,线程仍然处于sleep中,就出现了僵死线程

java多线程通信的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于多线程通信和多进程通信、java多线程通信的信息别忘了在本站进行查找喔。

The End

发布于:2022-11-28,除非注明,否则均为首码项目网原创文章,转载请注明出处。