如果多个线程在没有同步的情况下调用System.out.println(String),输出是否可以交错?或者每行写入原子?该API只字不提同步的,所以这似乎是可能的,或者是由缓冲和/或虚拟机存储器模型等防止交织输出?
编辑:
例如,如果每个线程包含:
System.out.println("ABC");
Run Code Online (Sandbox Code Playgroud)
输出保证是:
ABC
ABC
Run Code Online (Sandbox Code Playgroud)
或者它可能是:
AABC
BC
Run Code Online (Sandbox Code Playgroud) 我必须可视化大量数据(实时),我正在使用JavaFX 2.2.所以我决定在将数据插入GUI线程之前"预先可视化"数据.
在我看来,最快的方法(使用antialliasing等)是让一些NON GUI线程生成图像/位图然后放入GUI线程(因此UI仍然对用户响应).
但我找不到如何将Canvas转换为Image然后使用:
Image imageToDraw = convert_tmpCanvasToImage(tmpCanvas);
Platform.runLater(new Runnable() {
@Override
public void run() {
canvas.getGraphicsContext2D().drawImage(imageToDraw, data.offsetX, data.offsetY);
}
});
Run Code Online (Sandbox Code Playgroud)
这是一些有用的答案.:-)
顺便说一句:我已经制作了测试应用程序以显示我的问题.
package canvasandthreads02;
import java.util.Random;
import javafx.application.Application;
import javafx.application.Platform;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.scene.Scene;
import javafx.scene.canvas.Canvas;
import javafx.scene.canvas.GraphicsContext;
import javafx.scene.control.Button;
import javafx.scene.image.Image;
import javafx.scene.layout.AnchorPane;
import javafx.scene.paint.Color;
import javafx.stage.Stage;
public class CanvasAndThreads02 extends Application {
@Override
public void start(Stage primaryStage) {
Button btn = new Button();
btn.setText("Paint");
final AnchorPane root = new AnchorPane();
final Canvas canvas = …Run Code Online (Sandbox Code Playgroud) 我写了两个简单的程序,都绘制了相同的Sierpinski三角形:
一个程序使用swing实现,一个使用javafx.存在非常显着的性能差异,swing实现持续快得多:

(在这个测试案例中:超过1秒摆动Javafx超过12秒)
是否可以预料到或者我的javafx实现有什么问题?
Swing实现
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Point;
import java.awt.Polygon;
import java.awt.image.BufferedImage;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
public class SimpleSrpnskTriSw {
private Triangles triPanel;
SimpleSrpnskTriSw(int numberOfLevels){
JFrame frame = new JFrame("Sierpinski Triangles (swing)");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
triPanel = new Triangles();
frame.add(triPanel, BorderLayout.CENTER);
frame.pack();
frame.setResizable(false);
frame.setVisible(true);
triPanel.draw(numberOfLevels);
}
class Triangles extends JPanel{
private static final int PANEL_WIDTH =600, PANEL_HEIGHT = 600;
private static final int TRI_WIDTH= 500, TRI_HEIGHT= 500;
private static …Run Code Online (Sandbox Code Playgroud) 我正在学习 JavaFX 并且我制作了一个演示应用程序,该应用程序具有 Label 检测值更改并更改其显示。我试图将 Label.textProperty 绑定到该值,但仍然不起作用。这是我的代码:
public class MainApp extends Application {
public static void main(String[] args) {
launch(args);
}
private Temp aTemp = new Temp();
@Override
public void start(Stage primaryStage) {
try {
FXMLLoader loader = new FXMLLoader(getClass().getResource("Sample.fxml"));
BorderPane root = (BorderPane)loader.load();
SampleController sampleController = loader.getController();
Scene scene = new Scene(root,600,600);
scene.getStylesheets().add(getClass().getResource("application.css").toExternalForm());
primaryStage.setScene(scene);
primaryStage.show();
sampleController.setModel(aTemp);
} catch(Exception e) {
e.printStackTrace();
}
}}
Run Code Online (Sandbox Code Playgroud)
这是模型
public class Temp {
private StringProperty temp = new SimpleStringProperty("a");
private final ExecutorService service = …Run Code Online (Sandbox Code Playgroud)