1

我的程序中有两个线程,一个“发送者”和“接收者”线程。在不同时间的两个线程中,我需要写入文件。但是,我发现有时它们都同时写入文件,导致输入变得混乱。

有没有办法让程序在给定时间只有一个线程写入文件?

在另一个线程:Thread Synchronization中,有人告诉我使用 Synchronization 块。但是,当我尝试实现这一点时,我会收到关于我如何定义的错误:

private final Object lock = new Object();

它最初说:

无法对非静态字段锁定进行静态引用

如果我将其更改为静态,则它会说

类型的方法sychronized(Object)未定义SendThread

是否synchronized(lock)需要在函数内部,或者它可以只在一些代码周围?

如果这种方法对我当前的问题有帮助,我应该在哪里以及如何定义上述内容?

我的代码结构如下:

public class my_main_class{

    private final static Object lock = new Object();

    public static void main (String[] args) throws Exception{

        class SendThread implements Runnable {

            synchronized (lock){
                  // contains code to print to text file
            }
         }

         class ReceiveThread implements Runnable {

            synchronized (lock){
                 // contains code to print to text file
            }
         }

}
4

1 回答 1

3

synchronized仅在持有特定锁时将代码块标记为可执行。在 Java 中,您不能在任何地方插入代码,它必须在方法或初始化块内。

因此,您的问题不是多线程问题,而是基本的 Java 语法问题。

我想这可以达到你的预期:

class SendThread implements Runnable {
    public void run() {
        synchronized (lock){
              // contains code to print to text file
        }
    }
 }

 class ReceiveThread implements Runnable {
    public void run() {
        synchronized (lock){
              // contains code to print to text file
        }
    }
 }

然后在你的主要:

private final static Object lock = new Object();

public static void main (String[] args) throws Exception{
    Runnable send = new SendThread();
    Runnable recv = new ReceiveThread();
    new Thread(send).start();
    new Thread(recv).start();
}

我不知道这些方法应该做什么,所以它可能不是正确的设计,但至少它可以编译并且这两种run方法是互斥的。

于 2013-06-06T07:36:29.357 回答