小编Dij*_*tra的帖子

将本地新对象传递给线程,线程安全吗?

我有一个方法(下面的示例),它创建一个新列表,将一些东西放入其中,并将其传递给另一个线程进行操作.

这似乎是线程安全的.该列表是创建它的方法的本地.该方法在列表上运行,并且在对其进行操作之前不会将其传递给另一个线程.

但这感觉不对,因为列表是在两个单独的线程中访问的,但它不同步.

这是可接受的线程安全代码吗?

class App
{
  public static void main(String[] args)
  {
    final ArrayList<Integer> list = new ArrayList<Integer>();
    list.add(4);
    list.add(5);

    final ExecutorService es = Executors.newSingleThreadExecutor();
    es.execute(new Runnable() {
        @Override public void run()
        {
          for (Integer i : list)
            System.out.println(i);
        }});
    es.shutdown();
  }
}
Run Code Online (Sandbox Code Playgroud)

java concurrency multithreading thread-safety

10
推荐指数
1
解决办法
698
查看次数

当从runnable调用时,Java断言不会发送到控制台

在我的程序中,我从一个可运行的程序中创建了一个断言 - 其值为false - 但从未看到有关断言的任何控制台输出.我想知道我的断言是否为假,但似乎runnable正在捕获所有抛出的断言?

下面是我可以编写的最简单的示例程序来演示.(断言已启用.如果不是,则程序的行为会有所不同,并打印两行而不是一行).该程序的输出是.

即将断言False

而已.在那之后,断言语句抛出并被某些东西捕获,我从来不知道它.我想知道它,我做错了什么?

import java.nio.ByteBuffer;
import java.util.concurrent.*;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;

import java.awt.FlowLayout;
import javax.swing.*;

class App
{
  private static final ScheduledExecutorService sExecutor =
    Executors.newSingleThreadScheduledExecutor();

  // Main
  public static void main(String[] args)
  {
    javax.swing.SwingUtilities.invokeLater(new Runnable() {
        public void run() { createAndShowGUI(); } });

  }

  // Swing GUI
  private static void createAndShowGUI()
  {
    // Just create a swing thing. Boring
    JFrame frame = new JFrame("Title String");
    JLabel label = new JLabel("Hello World");
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.getContentPane().add(label);
    frame.getContentPane().setLayout(new FlowLayout()); …
Run Code Online (Sandbox Code Playgroud)

java assert runnable

6
推荐指数
1
解决办法
862
查看次数

使用 Oracle javac 与 OpenJDK javac 进行编译

我们的软件以前随 OpenJDK JRE 一起提供,但现在我们将提供 Oracle JRE。

之前我们使用 OpenJDK javac 编译器进行编译。我现在假设我们应该使用 Oracle javac 编译器,因为在使用 Oracle JRE 运行时它更有可能生成无问题的代码。这样对吗?

如果是这样,如何验证 javac 供应商?如果使用错误的编译器,我希望 makefile 出错(我们的旧软件版本将使用 OpenJDK 编译器,而新版本将使用 Oracle 编译器)。

java

0
推荐指数
1
解决办法
244
查看次数