java进程通信问题
package ThreadTest;
import java.util.ArrayList;
import java.util.List;
public class FirstThread {
static List<Object> goods = new ArrayList<>(); //储存物品的仓库,最多储存1
public static void main(String[] args) throws InterruptedException {
Producer thread1 = new Producer();
Consumer thread2 = new Consumer();
Thread p1 = new Thread(thread1, "生产者1");
Thread p2 = new Thread(thread1, "生产者2");
Thread p3 = new Thread(thread1, "生产者3");
Thread c1 = new Thread(thread2, "消费者1");
Thread c2 = new Thread(thread2, "消费者2");
Thread c3 = new Thread(thread2, "消费者3");
p1.start();
p2.start();
p3.start();
c1.start();
c2.start();
c3.start();
}
static class Producer implements Runnable {
@Override
public void run() {
// TODO Auto-generated method stub
int num = 0;
while(true) {
synchronized (goods) {
if(goods.size()==0) {
goods.add("商品" + ++num);
System.out.println(Thread.currentThread().getName()+"生产了第"+num+"个产品");
}
else if(goods.size()>0)
try {
goods.wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
try {
Thread.sleep(100);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
static class Consumer implements Runnable {
@Override
public void run() {
// TODO Auto-generated method stub
int num = 0;
while(true) {
synchronized (goods) {
if(goods.size()>0) {
goods.remove("商品"+ ++num);
System.out.println(Thread.currentThread().getName()+"消费了第"+num+"个产品");
}
else if (goods.size()==0)
goods.notify();;
}
try {
Thread.sleep(100);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
}
为什么所有的生产者不是共用一个num,输出时每个生产者都会输出1,2...。我按照书上的例子可以实现共享,是不是这里是内部类的问题,但是如果不用内部类我又怎么实现生产者和消费者之间的通信呢,
顺便再问一个问题,那就是我按照书上的例子敲的,但是每次执行的结果都是几乎由一个窗口完成全部售票,没有达到上下两张票的窗口一定不同,代码如下:
按理来说sleep(100)会保证不让同一线程连续执行
package ThreadTest;
class SaleThread2 implements Runnable {
int tickets = 10;
Object lock = new Object();
@Override
public void run() {
// TODO Auto-generated method stub
while(true) {
synchronized (lock) {
if(tickets>0) {
try {
Thread.sleep(100);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()+"正在出售第"+tickets-- +"张票");
}
}
}
}
}
public class Example12 {
public static void main(String[] args) {
SaleThread2 st = new SaleThread2();
new Thread(st, "窗口1").start();
new Thread(st, "窗口2").start();
new Thread(st, "窗口3").start();
new Thread(st, "窗口4").start();
}
}
...全文
相关推荐
机器学习项目前(java)后端(python)进程通信问题
在进行机器学习项目时,尤其是在前后端技术栈分离的情况下,如Java负责前端界面,Python负责模型处理,如何确保高效的进程间通信成为一个关键问题。本文主要关注的是Java与Python之间的通信,以
java进程通信.zip
**共享内存(Shared Memory)**:虽然Java标准库没有直接提供共享内存的支持,但可以通过JNI调用操作系统级别的API实现。这种方法可以提供高速的数据交换,但需要谨慎处理同步问题。
java写的进程通信源码
请确保仔细阅读并分析提供的源码,以便更好地理解实际应用场景和潜在问题。
操作系统进程通信Java源码
在Java中,进程通信主要通过以下几种方式实现:1.
基于Java的进程通信.zip
Java的`java.nio.channels.FileLock`可以用来解决这个问题,确保同一时间只有一个进程能访问特定的文件部分。6.


Java SE
