「java多线程通信」多线程通信和多进程通信
今天给各位分享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多线程通信的信息别忘了在本站进行查找喔。
发布于:2022-11-28,除非注明,否则均为
原创文章,转载请注明出处。