while (true){ repaint(); try { Thread.sleep(100); } catch (InterruptedException e) { throw new RuntimeException(e); }优化这段代码
时间: 2024-02-10 11:05:32 浏览: 84
这段代码是一个无限循环,每100毫秒重绘一次界面。为了优化这段代码,可以将Thread.sleep(100)替换为Object.wait(100),这样可以避免线程被中断的问题,并且在等待期间可以释放对象锁,以便其他线程可以访问该对象。修改后的代码如下:
```
while (true){
repaint();
try {
synchronized(this) {
wait(100);
}
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
}
```
另外,如果界面不需要实时重绘,可以考虑使用定时器(Timer)或者线程池(ThreadPoolExecutor)来控制重绘频率,以便更好地控制系统资源的使用。
相关问题
帮我精简以下代码:while (isDrawing1) { move += gap; repaint(); try { Thread.sleep(20); } catch (InterruptedException e) { e.printStackTrace(); } } while (isDrawing2) { move += gap; repaint(); try { Thread.sleep(20); } catch (InterruptedException e) { e.printStackTrace(); } } while (isDrawing3) { move += gap; repaint(); try { Thread.sleep(20); } catch (InterruptedException e) { e.printStackTrace(); } } while (isDrawing4) { move += gap; repaint(); try { Thread.sleep(20); } catch (InterruptedException e) { e.printStackTrace(); } } }
你可以将重复的代码提取出来,只保留一次即可。可以使用数组或集合来存储 `isDrawing` 变量,然后遍历数组或集合,对每个元素执行相同的操作。例如:
```
boolean[] isDrawing = {isDrawing1, isDrawing2, isDrawing3, isDrawing4};
while (true) {
for (boolean isDrawingItem : isDrawing) {
if (isDrawingItem) {
move += gap;
repaint();
try {
Thread.sleep(20);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
```
在这个例子中,我们使用了一个布尔型数组 `isDrawing` 来存储 `isDrawing1` 到 `isDrawing4` 四个变量。然后,我们使用 `for` 循环遍历该数组,对每个数组元素执行相同的操作。这样,我们就避免了重复代码的问题。
public void action(){ Thread thread = new Thread(); @Override public void run(){ while(true){ try { Thread.sleep(10); }catch (InterruptedException e) { // TODO: handle exception e.printStackTrace(); } repaint(); } };
这段代码仍然存在一些问题。下面是对代码进行修正的建议:
```java
public void action() {
Thread thread = new Thread() {
@Override
public void run() {
while (true) {
try {
Thread.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}
repaint();
}
}
};
thread.start();
}
```
修正后的代码中,我们在创建线程对象时直接使用了匿名内部类来重写`run`方法。然后调用`start()`方法来启动线程。
请注意,这段代码依然需要在适当的上下文环境中使用,比如在一个继承自`Canvas`或`JPanel`的组件类中调用`action()`方法。
如果你有任何进一步的问题,请随时提问。
阅读全文