当前位置: 首页 > 面试题库 >

线程同步Java

简嘉赐
2023-03-14
问题内容

我正在使用Android App,无法将View与硬件同步。让我解释。

1)我从线程1的run方法中基于数组A中存储的随机值(即随机睡眠)对Android的麦克风进行静音和取消静音。

2)我画出反映麦克风静音的蓝色脉冲。这是通过独立的View类完成的。

3)通过从倒数计时器的onTick内调用,我在上面视图中绘制的图形上移动了一条红线。

我以这种方式一个接一个地启动两个线程:

线程1.开始

counter.start();

如何同步这两个,我想一次做三件事,避免多个线程。三件事是:绘制脉冲(恒定),使红色线越过x轴移动,电话静音后立即触摸蓝色脉冲,并保持每秒移动一次,脉冲的宽度反映了延迟的持续时间。麦克风即将取消静音后,红线应离开脉冲并向前移动。

目前,代码正在执行我想要的操作。但没有同步。麦克风要么先工作,要么图形移动很快。他们不处于同步状态。

有没有办法保留线程,强制其充当coutdowntimer或同步它们两者。我无法将红线运动嵌入线程1中,因为它必须每秒在x轴上移动一次。


问题答案:

听起来您将需要使用“
ReentrantLock
”和“
Condition



您可以使用通过可重入锁创建的条件使一个线程“等待”另一个线程:

private ReentrantLock lock = new ReentrantLock();
private Condition condition = lock.newCondition();
private boolean someFlag = false;
public void threadOneMethod() {
  lock.lock();
  try {
    someFlag = true;
    condition.signalAll();
  } finally {
    lock.unlock();
  }
}
public void threadTwoMethod() {
  lock.lock();
  try {
    while (someFlag == false) {
      condition.await();
    }

    System.out.println("Did some stuff");
    someFlag = false;
  } finally {
    lock.unlock();
  }
}

threadTwoMethod中的“
condition.await()”行将导致threadTwoMethod暂停,直到threadOneMethod调用“
condition.singalAll()”。在条件上调用信号或等待之前,您必须拥有创建条件的锁,这就是我们调用“ lock.lock()/
lock.unlock()”的原因。

对await()的调用应放置在while循环中,因为即使未发出等待信号的条件,您的线程也可能被随机唤醒。在此示例中,通过使用布尔标志完成循环。

请记住在尝试并最终阻止时锁定/解锁。如果抛出异常,您将要确保您仍然解锁自己的锁,这就是为什么我们在最终块中放入解锁。

您还可以使用LinkedBlockQueue和“
take”以一种不太混乱的方式完成类似的事情。如果我有更多的时间,我会更加明确,但是我希望这会有所帮助。



 类似资料:
  • 下面的代码创建了一个新的custom um < code > Thread ,并等待线程结束,直到主线程再次激活。 > < li >我不太明白它是如何工作的。为什么< code > myth read . wait();立即接到电话? < li> 为什么不改用< code>Thread.join()? 公共静态void main(String[] args) {

  • 所以我有一个代码: 所以我将线程添加到我的线程列表中,然后启动这些线程。这是MyThread类: 我想做一个程序来创建线程,将它们添加到列表中,调用它们,但是每个线程都应该等到前一个线程结束它的任务。因此输出应该如下所示: 如何使用实现这一点?我尝试了使用的不同方法,但失败了。

  • 互斥锁 条件变量 POSIX信号量

  • 主要内容:1 什么是Java 线程同步,2 为什么使用Java线程同步,3 Java同步类型,4 Java线程同步的类型,5 线程互斥,6 Java锁的概念,7 线程并发问题引发数据不一致,8 Java synchronized方法的例子1,9 Java synchronized方法的例子21 什么是Java 线程同步 Java中的同步是控制多个线程对任何共享资源的访问的能力。 Java同步是更好的选择,我们希望只允许一个线程访问共享资源。 2 为什么使用Java线程同步 Java线程同步主要用

  • 我有3节课是这样的: 来源Java语言 任务Java语言 主要的Java语言 当类源的x等于4时,只有一个任务继续递增x,直到x等于8,我们恢复正常。结果如下: 要获得此结果,我需要修复什么?

  • 我试图更好地理解Java多线程。所以,我知道这句话说只有一个线程可以访问一个对象实例,从而调用该实例的方法(例如,在这种情况下,类 中的减方法。 但是,当你仍然有相同的 会发生什么,但两个线程与不同的 相关联,完全试图调用 的方法?我以为不的消息永远不会被打印出来,但它确实打印出来了。毕竟,仍然只有一个对象实例 ,这是否意味着同步不适用于此示例?