Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/330.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java启动线程问题_Java_Multithreading - Fatal编程技术网

Java启动线程问题

Java启动线程问题,java,multithreading,Java,Multithreading,这是我简单代码的一部分。该代码包含可移动椭圆和静态椭圆,带有坐标newX=100,newY=100。我试图在点击鼠标左键后自动移动该可移动椭圆。移动代码行位于新线程Thread。Thrad实际上是从单击鼠标按钮开始的,但什么也没发生。在使用箭头键移动一步之后,椭圆开始移动。我尝试在不同的位置调用repaint()方法,但似乎没有帮助。有什么建议吗?谢谢大家! public class Buffer extends JPanel implements Runnable,KeyListener,Mo

这是我简单代码的一部分。该代码包含可移动椭圆和静态椭圆,带有坐标
newX=100,newY=100
。我试图在点击鼠标左键后自动移动该可移动椭圆。移动代码行位于新线程
Thread
。Thrad实际上是从单击鼠标按钮开始的,但什么也没发生。在使用箭头键移动一步之后,椭圆开始移动。我尝试在不同的位置调用
repaint()
方法,但似乎没有帮助。有什么建议吗?谢谢大家!

public class Buffer extends JPanel implements Runnable,KeyListener,MouseListener{
public static int x;
public static int y;
public static int newX;
public static int newY;
public static Thread thread;
public static boolean check;
public static JFrame frame;
public static int pointX;
public static int pointY;
public static boolean repaint;


public void paintComponent(Graphics g){
    super.paintComponent(g);

    g.drawOval(x, y, 20, 20);

        newX=100;
        newY=100;
        g.fillOval(newX, newY, 20, 20);

        if(repaint)
            repaint();
}
public static void main(String args[]){
    Buffer z=new Buffer();
    z.setBackground(Color.white);

    frame=new JFrame();
    frame.setSize(500,500);
    frame.addKeyListener(z);
    frame.addMouseListener(z);
    frame.add(z);
    frame.setVisible(true);
    frame.requestFocusInWindow();

    thread=new Thread(){
        public void run(){
            try{
                for(int i=0;i<=5;i++){
                    x=x+i;
                    repaint=true;
                    thread.sleep(1000);

                }
            }catch(InterruptedException v){System.out.println(v);}
           }
        };

}
public void keyPressed(KeyEvent e){
    if(e.getKeyCode()==KeyEvent.VK_LEFT){
        x=x-10;
        repaint();
    }
    if(e.getKeyCode()==KeyEvent.VK_RIGHT){
        x=x+10;
        repaint();
    }
    if(e.getKeyCode()==KeyEvent.VK_UP){
        y=y-10;
        repaint();
    }
    if(e.getKeyCode()==KeyEvent.VK_DOWN){
        y=y+10;
        repaint();
    }
}

public void mouseClicked(MouseEvent e) {
        thread.start();
    }
}
公共类缓冲区扩展JPanel实现Runnable、KeyListener、MouseListener{
公共静态int x;
公共静态智力;
公共静态int-newX;
公共静态int-newY;
公共静态线程;
公共静态布尔检查;
公共静态JFrame;
公共静态int pointX;
公共静态int-pointY;
公共静态布尔重绘;
公共组件(图形g){
超级组件(g);
g、 牵引椭圆(x,y,20,20);
newX=100;
newY=100;
g、 fillOval(newX,newY,20,20);
如果(重新喷漆)
重新油漆();
}
公共静态void main(字符串参数[]){
缓冲区z=新缓冲区();
z、 挫折地面(颜色:白色);
frame=新的JFrame();
框架。设置尺寸(500500);
frame.addKeyListener(z);
帧。addMouseListener(z);
帧。添加(z);
frame.setVisible(true);
frame.requestFocusInWindow();
线程=新线程(){
公开募捐{
试一试{

对于(int i=0;i您正在修改一个线程中的共享变量,并从另一个线程中读取它们,而没有任何类型的同步。这是错误的。对共享变量的每次访问都必须以同步方式完成,或者应该使用线程安全对象(例如AtomicInteger)


此外,线程在循环中修改
x
值,但从不调用
repaint()
,因此面板没有理由重新绘制自身。

您正在从一个线程修改共享变量,并从另一个线程读取它们,而不进行任何同步。这是错误的。对共享变量的每次访问都必须以同步方式完成,或者应该使用线程安全对象(例如AtomicInteger)


此外,线程在循环中修改
x
值,但从不调用
repaint()
,因此面板没有理由重新绘制自身。

我不知道这是否是可能的问题,但我将尝试一下:

尝试对
x
y
变量使用AtomicInteger,因为代码不是线程安全的

您正在尝试跨多个线程访问共享变量,并执行非原子的增量操作,因此不是线程安全的

private static AtomicInteger x = new AtomicInteger(0); //take the initial value that you need

//where you are incrementing the x
x.incrementAndGet();


//where you want to read x
value = x.get();

我不知道这是否是可能的问题,但我将尝试一下:

尝试对
x
y
变量使用AtomicInteger,因为代码不是线程安全的

您正在尝试跨多个线程访问共享变量,并执行非原子的增量操作,因此不是线程安全的

private static AtomicInteger x = new AtomicInteger(0); //take the initial value that you need

//where you are incrementing the x
x.incrementAndGet();


//where you want to read x
value = x.get();

我无法在静态方法中调用repaint()。这就是为什么我在paintComponent方法中使用布尔变量repaint来触发repaint()方法。更改布尔值不会神奇地调用方法。您需要在缓冲区上调用repaint()。因此,调用
z.repaint()
(并将变量
z
设为final,以便能够从内部类执行此操作)。也就是说,所有这些变量和方法都不应该是静态的。我感觉你还不了解OO的基本知识。在使用Swing之前,先学习基础知识,甚至在使用线程之前。并发编程非常复杂。我尝试过,现在它可以工作了。我只希望更改布尔变量会从块调用重新绘制
if(check)repaint();
。无论如何,非常感谢。你的感觉离现实不远。我对编程非常陌生。我不能在静态方法中调用repaint()。这就是为什么我在paintComponent方法中使用布尔变量repaint来触发repaint()方法。更改布尔值不会神奇地调用方法。你需要调用repaint()在buffer.So上,调用
z.repaint()
(并将变量
z
设为final,以便能够从内部类执行此操作)。也就是说,所有这些变量和方法都不应该是静态的。我感觉你还不了解OO的基本知识。在使用Swing之前,先学习基础知识,甚至在使用线程之前。并发编程非常复杂。我尝试过,现在它可以工作了。我只希望更改布尔变量会从块调用重新绘制
if(check)repaint();
。无论如何,非常感谢。你的感觉离现实不远。我对编程相当陌生。