gpt4 book ai didi

java - System.out.printf() 语句是异步的吗?

转载 作者:行者123 更新时间:2023-12-02 12:19:51 25 4
gpt4 key购买 nike

我正在打印信息以使用可重入锁测试线程。我正在使用语句 new ReentrantLock(true) 创建公平锁。

在我使用锁的对象方法之一中,我使用的是方法,例如

method() {
for (int n = 0; n < 3; n++) {
System.out.printf("%s: processing data \n",
Thread.currentThread().getName(), data.get());
TimeUnit.SECONDS.sleep(1);
}
}

我正在创建 10 个线程,所有线程都应在执行此控制台打印语句的地方执行相同的语句 3 次。但是,当我看到每个线程都以相同的顺序显示打印时,我没有得到输出。例如

Thread 1: processing data hjjjj
Thread 2: processing data ghhjj
Thread 3: processing data uiyiii
Thread 2: processing data ghfrtu
......
......

而我的预期如下:

Thread 1: processing data hjjjj
Thread 2: processing data ghhjj
Thread 3: processing data uiyiii
Thread 1: processing data uiyuii

是否是因为公平性正在发挥作用,但 system.out.println 的打印顺序与发出的打印命令的顺序不同?

这是我的类(class)..

public class PriceInfo {
private double price1 =1d, price2=2d;
ReadWriteLock lock = new ReentrantReadWriteLock(true);

public double getPrice1() {
lock.readLock().lock();
try{
return price1;
}finally{
lock.readLock().unlock();
}
}

public double getPrice2() {
lock.readLock().lock();
try{
return price2;
}finally{
lock.readLock().unlock();
}
}

public void getPrices() {
lock.readLock().lock();
try{
synchronized (System.out) {
System.out.printf("%s: price1 = %f and price2 = %f \n", Thread.currentThread().getName(), price1, price2);
System.out.flush();
}
}finally{
lock.readLock().unlock();
}
}

public void setPrices(double p1, double p2) {
lock.writeLock().lock();
try{
System.out.println(Thread.currentThread().getName() + ": starting to set new prices ");
price1 = p1;
price2 = p2;
System.out.println(Thread.currentThread().getName() + ": prices changed to price1:"+ p1 + "price2: "+ p2);
}finally{
lock.writeLock().unlock();
}
}
}

现在还有另一个类..

public class Reader implements Runnable {

private PriceInfo info;
public Reader(PriceInfo inf) {
info = inf;
}
@Override
public void run() {
for (int i=0; i<2; i++) {
info.getPrices();
}
}
}

最后,我们有编写器线程和主类..

public class Writer implements Runnable{

private PriceInfo info;
public Writer(PriceInfo inf) {
info = inf;
}
@Override
public void run() {
for (int i=0; i<2; i++) {
info.setPrices(new Double(Math.random()*10).doubleValue(), new Double(Math.random()*9).doubleValue());
try {
Thread.sleep(2);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}

public static void main(String[] args) {

PriceInfo pricesInfo=new PriceInfo();

// create 5 threads and 5 readers
Reader readers[]=new Reader[5];
Thread threadsReader[]=new Thread[5];
for (int i=0; i<5; i++){
readers[i]=new Reader(pricesInfo);
threadsReader[i]=new Thread(readers[i],("Thread" + i));
}

// create writer thread

Writer writer=new Writer(pricesInfo);
Thread threadWriter=new Thread(writer,"WriterThread");

for (int i=0; i<5; i++){
threadsReader[i].start();
}
threadWriter.start();
}
}

我得到以下输出..

   Thread0: price1 = 1.000000 and price2 = 2.000000 
Thread4: price1 = 1.000000 and price2 = 2.000000
Thread3: price1 = 1.000000 and price2 = 2.000000
Thread2: price1 = 1.000000 and price2 = 2.000000
Thread1: price1 = 1.000000 and price2 = 2.000000
WriterThread: starting to set new prices
WriterThread: prices changed to price1:3.971662648848391price2: 8.604830021768233
Thread0: price1 = 3.971663 and price2 = 8.604830
Thread1: price1 = 3.971663 and price2 = 8.604830
Thread2: price1 = 3.971663 and price2 = 8.604830
Thread3: price1 = 3.971663 and price2 = 8.604830
Thread4: price1 = 3.971663 and price2 = 8.604830
WriterThread: starting to set new prices
WriterThread: prices changed to price1:3.0036555312769297price2: 5.15672274505239

所以,正如您所看到的,线程执行的顺序是线程0、线程4、3、2、1、写入器、0、1、2、3、4而我希望根据公平政策,我们应该具有相同的序列,例如 0,4,3,2,1 0,4,3,2,1。

我的代码有问题还是公平政策不严格?

最佳答案

I am creating 10 threads and all threads should executing same statement 3 times where this console print statement is executed. however, I am not getting output where I see every thread showing the print in same sequence. e.g.

使用线程很难(也没有必要)获得特定的输出序列。 System.out.printf(...) 是一个同步操作,因此输出永远不会相互重叠,但由于竞争,输出行的顺序是不可预测的同时运行多个线程所固有的条件。就异步而言(与线程同步无关),默认情况下System.out启用了自动刷新,因此所有写入都写入PrintStream 每次写入都会刷新。

线程应用程序的具体输出顺序是常见问题解答。在这里查看我的答案:unwanted output in multithreading

引用答案,由于硬件、竞争条件、时间切片随机性和其他因素,线程运行的顺序无法预测。

关于java - System.out.printf() 语句是异步的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18830875/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com