java - 为什么我的程序在间隔后不显示背景颜色变化?
问题描述
我已经尝试了几个小时来找出我在 java 中的一个简单程序中的错误。我希望在 200 毫秒后显示背景颜色的变化,所以我编写了这个程序,但它没有显示正确的输出。
这是一个很长的程序提前感谢您的阅读。
public class bgColor extends Applet implements Runnable
{
Thread timer=null;
int c,flag;
public void init()
{
c=0;
setBackground(new Color(255,255,255));
}
public void start()
{
if(timer==null)
{
timer=new Thread(this);
timer.start();
}
}
public void paint(Graphics g)
{
switch(c)
{
case 0:setBackground(Color.white);
break;
case 1:setBackground(Color.blue);
break;
case 2:setBackground(Color.green);
break;
case 3:setBackground(Color.red);
break;
}
if(c==4)
{
flag=0;
}
else if(c==0)
{
flag=1;
}
if(flag==0)
{
c--;
}
else if(flag==1)
{
c++;
}
}
public void stop()
{
timer=null;
}
public void run()
{
if(timer!=null)
{
repaint();
c++;
try
{
Thread.sleep(200);
}
catch(InterruptedException e){}
}
timer=null;
}
}
我基本上设置了一个开关,用于在特定时间间隔后更改背景颜色,但它始终只显示红色。
如果有人可以建议我可以在哪里阅读程序如何逐步运行,就像我认为可能是 init(),然后 start() 然后 run(),然后paint(),然后 stop(),这也会有很大帮助,但这纯粹是我猜。我需要一个真实的来源。
解决方案
你试过打印c
吗?
线程运行的频率高于paint
因为即使你调用repaint
一百万次,它每帧最多只能绘制一次。睡眠有帮助,但它只会降低竞争条件的风险,而不是消除问题。
您还有一个竞争条件,c
可以超过 4 并且标志永远不会切换。尝试使用c >= 4
andc <= 0
来避免这种情况。根据您的描述,这可能是您的问题。
推荐阅读
- c# - 如何使用 doc.ImportPage Syncfusion 导入 Word 文档
- node.js - 使用 Node.js / Express 的 Application Insights
- ios - xmppframework 查看另一个用户的 vCard
- json - 从 json 解析枚举
- powershell - IIS 场的自动化
- javascript - 我的不和谐机器人并不总是在反应事件上触发
- sqlite - sqlite3 数据库上的更新(等长数据)是否会影响数据库的文件大小
- typescript - 如何在 typeorm、postgres 中组合 3 列唯一的?
- python - 在python中编写“hello world”的unicode方式
- javascript - CRM平台电子签名插件中使用的签名板和DOMPDF