Java中如何实现父线程如何获得子线程数据?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java中如何实现父线程如何获得子线程数据?相关的知识,希望对你有一定的参考价值。

我想每隔1秒刷心一个java的界面大家有什么好办法?我目前是用下面方法,但是总是报错。
LBChart2DFrameDemo demo = new LBChart2DFrameDemo();

//设定睡眠时间
new Thread(new Runnable()
public void run()
System.out.println("耗时的操作最好独立一个线程来处理");
for (int i = 0; i < 10; i++)
System.out.println("每隔一秒执行一次");
try
Thread.sleep(1000);
demo.init();//此行出错:提示如下:local variable demo is accessed from within inner class; needs to be declared final
catch (InterruptedException e)
System.out.println("InterruptedException: " + e.getMessage());
Thread.currentThread().interrupt();



).start();
//显示一下
demo.start();

参考技术A 建立一个类
继承Thread或者Runnable接口就自己看着办了
然后在run方法法里面
while(true)

××××××
//写上重画的代码

Thread.sleep(1000);

参考技术B 线程并无父子之称,在同一个系统中,线程与所有同优先级的线程争用CPU。线程倒是可以分主次,主线程是系统调用mainCRTStartUp建立的线程,负责调用main,main退出后调用exit.exit又会调用ExitProcess结束进程。 参考技术C public class NewClass

public static void main(String[] args)
final Rectangle[] rects = new Rectangle[4];
final Color[] colors = new Color[]Color.BLACK, Color.BLACK, Color.BLACK, Color.BLACK;
for (int i = 0; i < 4; i++)
rects[i] = new Rectangle(i * 60, i * 60, 50, 50);

JFrame frame = new JFrame();
final JPanel panel = new JPanel()

@Override
public void paint(Graphics g)
super.paint(g);
Graphics2D g2D = (Graphics2D) g;
for (int i = 0; i < 4; i++)
g2D.setColor(colors[i]);
g2D.draw(rects[i]);


;
Timer timer = new Timer(1000, new ActionListener()

@Override
public void actionPerformed(ActionEvent e)
int n = (int) (Math.random() * 3);
for (int i = 0; i < 4; i++)
if (i == n)
colors[i] = Color.RED;
else
colors[i] = Color.BLACK;

panel.repaint();


);
timer.setRepeats(true);
timer.start();
frame.setDefaultCloseOperation(3);
frame.getContentPane().add(panel);
frame.setVisible(true);


一秒一次。本回答被提问者采纳
参考技术D public class NewClass

public static void main(String[] args)
final Rectangle[] rects = new Rectangle[4];
final Color[] colors = new Color[]Color.BLACK, Color.BLACK, Color.BLACK, Color.BLACK;
for (int i = 0; i < 4; i++)
rects[i] = new Rectangle(i * 60, i * 60, 50, 50);

JFrame frame = new JFrame();
final JPanel panel = new JPanel()

@Override
public void paint(Graphics g)
super.paint(g);
Graphics2D g2D = (Graphics2D) g;
for (int i = 0; i < 4; i++)
g2D.setColor(colors[i]);
g2D.draw(rects[i]);


;
Timer timer = new Timer(1000, new ActionListener()

@Override
public void actionPerformed(ActionEvent e)
int n = (int) (Math.random() * 3);
for (int i = 0; i < 4; i++)
if (i == n)
colors[i] = Color.RED;
else
colors[i] = Color.BLACK;

panel.repaint();


);
timer.setRepeats(true);
timer.start();
frame.setDefaultCloseOperation(3);
frame.getContentPane().add(panel);
frame.setVisible(true);


一秒一次

参考:麦子学院
第5个回答  2010-06-12 local variable demo is accessed from within inner class; needs to be declared final

唉,英文字典都懒得查了吗,翻译一下吧:内部类访问了本地变量demo,demo需要先声明为final

还有问题就去看java内部类、匿名类

Java中是否父线程阻塞后子线程就无法继续执行?

如果不是,该如何实现阻塞父线程但继续执行子线程?

不是,这个问题属于线程调度。
让一个线程明确的给另外一个线程运行机会,采用以下方法:
1.调整线程优先级
2.让处于运行状态的线程调用Thread.sleep()方法
3.让处于运行状态的线程调用Thread.yield()方法
4.让处于运行状态的线程调用另外一个线程的jion()方法
参考技术A 在父进程做判断呗,符合条件开启子进程,让父进程sleep 或者循环判断。如果不需要了可以直接结束父进程。 参考技术B 提高一下线程优先级别试一下

以上是关于Java中如何实现父线程如何获得子线程数据?的主要内容,如果未能解决你的问题,请参考以下文章

京东一面:子线程如何获取父线程 ThreadLocal 的值?我蒙了。。。

父子线程和线程池如何实现threadLocal变量传递

子线程如何获取父线程ThreadLocal的值

如何重用线程 - pthreads c

如何在子线程中访问父线程的空间

Java子线程中的异常处理(通用)