java - 在 main 方法中启动手动线程
问题描述
我正在使用 java 中的一些低级多线程,其中有两种方法生产和消费:
public class Producer {
private LinkedList<Integer> list = new LinkedList();
private final int LIMIT = 10;
private Object lock = new Object();
public void produce() throws InterruptedException {
int value = 0;
while (true) {
synchronized (lock) {
// while loopet er til, for at blive ved med at tjekke at tjekke, at listen er fuld
while (list.size() == LIMIT) {
//notify vækker dette while-loop
lock.wait(); //låsen venter indtil der er plads til at blive taget en ny værdi ud
System.out.println("hej");
}
list.add(value++);
lock.notify();
}
}
}
public void consume() throws InterruptedException {
Random random = new Random();
while (true) {
synchronized (lock) {
while (list.size() == 0) {
lock.wait();
}
System.out.print("list size is " + list.size());
int value = list.removeFirst();
System.out.println("Current value is " + value);
lock.notify();
}
Thread.sleep(random.nextInt(1000));
}
}
}
我可以在 main 方法中放入什么让线程运行?由于我的情况是没有使用 Runnable 接口的线程,我无法启动它们,并且实例化一个对象,并且调用方法不起作用?
解决方案
您可以使用匿名线程来执行此操作。
public static void main(String args[]) throws IOException, SaxonApiException {
Producer producer = new Producer();
new Thread()
{
public void run() {
try {
producer.consume();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}.start();
new Thread()
{
public void run() {
try {
producer.produce();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}.start();
}
我在输出中得到的是这个。
list size is 1Current value is 0
list size is 10Current value is 1
hej
list size is 10Current value is 2
hej
list size is 10Current value is 3
hej
list size is 10Current value is 4
hej
推荐阅读
- javascript - 类型“JQuery”上不存在属性“sectionsnap”
' - angular - Mat-Paginator Page-Size-Dropdown 未正确呈现
- azure - 在 Azure Function 中生成 html 电子邮件正文
- mysql - 在mySQL中使用带有外键的第三个表连接两个表
- r - 堆叠条形图作为每类观察百分比的函数,而不更改 ggplot2 中的值
- jenkins - 将本地 linux Jenkins 集成到 Github 企业的最佳方法是什么?
- java - Java中如何避免过多的for循环?
- java - 通过jFrame将数据插入mysql数据库
- ios - Swift - 在 viewWillTransition() 期间未调用 TextView layoutSubviews()
- filter - DAX - 在两个指定日期之间过滤