我有一个方法(下面的示例),它创建一个新列表,将一些东西放入其中,并将其传递给另一个线程进行操作.
这似乎是线程安全的.该列表是创建它的方法的本地.该方法在列表上运行,并且在对其进行操作之前不会将其传递给另一个线程.
但这感觉不对,因为列表是在两个单独的线程中访问的,但它不同步.
这是可接受的线程安全代码吗?
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) 在我的程序中,我从一个可运行的程序中创建了一个断言 - 其值为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) 我们的软件以前随 OpenJDK JRE 一起提供,但现在我们将提供 Oracle JRE。
之前我们使用 OpenJDK javac 编译器进行编译。我现在假设我们应该使用 Oracle javac 编译器,因为在使用 Oracle JRE 运行时它更有可能生成无问题的代码。这样对吗?
如果是这样,如何验证 javac 供应商?如果使用错误的编译器,我希望 makefile 出错(我们的旧软件版本将使用 OpenJDK 编译器,而新版本将使用 Oracle 编译器)。