我有一个日志代码,需要在所有Threadss 执行后执行.
Thread t1 = new MyThread();
Thread t2 = new MyThread();
t1.run();
t2.run();
doLogging();
Run Code Online (Sandbox Code Playgroud)
是否有任何方法doLogging()只有在两个线程完成其处理后才能执行.现在,doLogging()只要t1和t2开始,就会调用它.
我的Android应用程序使用了一个特别大的计算,它会使系统崩溃,因为它位于Activity中的UI线程上.我对多线程没什么信心,所以我想得到一些关于如何正确执行的提示.这就是我所拥有的
class ActivtyName extends Activity{
boolean threadcomplete = false;
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//stuff
Runnable newthread = new Runnable(){
@Override
public void run() {
doBigComputation();
threadcomplete=true;
}
};
newthread.run();
boolean b = true;
while(b){
if(threadcomplete){
b=false;
startTheApp();
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
现在,我很确定我做的不是"正确".(它似乎工作.这个系统不会崩溃).基本上,我不确定如何在没有此布尔值,threadcomplete的情况下告知UI线程newthread已完成计算.有没有"正确"的方法来做到这一点?
我有一些设置计时器的代码,但是如果用户在使用它时设置计时器,我需要删除运行计时器的runnable并再次启动它.但是当没有处理程序回调runnable存在并且调用此代码时,它会崩溃我的应用程序.所以我需要检查一个处理程序是否正在运行,如果是,然后结束它并重新启动它,但查看文档和其他Stackoverflow问题,我看不出这是否可行.
这是我的代码,我已经对代码进行了评论,只有在处理程序runnable存在时才应该执行:
submitTimer.setOnClickListener(new View.OnClickListener(){
public void onClick(View v) {
String s = timer.getText().toString();
if(!s.equals(""))
{
//I NEED TO CHECK A RUNNABLE HANDLER EXISTS AND IF SO THEN RUN THIS CODE, IF NOT IGNORE THIS CODE
Map.handler.removeCallbacks(Map.getRunnable());
Map.runnable.run();
//I NEED TO CHECK A RUNNABLE HANDLER EXISTS AND IF SO THEN RUN THIS CODE, IF NOT IGNORE THIS CODE
int l = Integer.parseInt(s);
Map.timerinmins = l;
timer.setHint("Current Timer is "+Map.timerinmins);
timer.setText("");
Toast.makeText(Preferences.this, "Timer is set!", Toast.LENGTH_SHORT).show();
}
else
{
Toast.makeText(Preferences.this, "No value …Run Code Online (Sandbox Code Playgroud) 假设我有一些工作单元需要完成,我想相对于我的应用程序的其余部分进行异步操作,因为它可能需要很长时间,例如10秒到2分钟.要做到这一点,我正在考虑两个选择:
run();.在上述情况下,我有以下问题:
我是Java的初学者,并创建了一个简单的Java Android代码片段,在1.5秒后我在Runnable中将TextViewfrom 更改Hello World为Hola Mundo.它完美无缺,基本上WeakReference应该防止这种内存泄漏发生吗?我怀疑是否在设备方向发生时绝对没有内存泄漏.我很想检查这个,但无法在我模拟的Android中改变方向.
这是代码:
package com.example.helloworld;
import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.widget.TextView;
import android.util.Log;
import java.lang.ref.WeakReference;
public class HelloWorldActivity extends Activity
{
private Handler h = new Handler();
private static TextView txtview;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
txtview = (TextView) findViewById(R.id.mainview);
h.postDelayed(new WeakRunnable(txtview),1500);
}
private static final class WeakRunnable implements Runnable {
private final WeakReference<TextView> mtextview; …Run Code Online (Sandbox Code Playgroud) 我正在开发一个多线程应用程序来连接外部服务器 - 每个都在不同的线程上 - 并且会被阻塞直到有输入.其中每个都扩展了Thread类.为了便于解释,我们称之为"连接线程".
所有这些连接线程都存储在并发hashmap中.
然后,我允许RESTful Web服务方法调用取消任何线程.(我正在使用Grizzly/Jersey,所以每次调用都是一个线程.)
我检索特定的连接线程(来自hashmap)并在其上调用interrupt()方法.
那么,这是一个问题,在连接线程中,我如何捕获InterruptedException?(当外部RESTful命令停止连接线程时,我想做点什么.)
我想知道在java中是否有可能有一个实现Runnable的类,如果该类的对象进入wait()(所以线程停止运行直到它收到一个信号),同一个类的另一个对象可以通知它继续跑步?
理想情况下,我希望能够做到的是:
public class ThreadClass implements Runnable{
public void run(){
//.. Does some arbitrary work
if( aCondition){ //have it wait until something signals it to contine exection.
this.wait();
}
//Continues to do more work.
//finished whatever it needed to do. Signal all other threads of this object type to continue their work.
this.notifyAll();
}
}
Run Code Online (Sandbox Code Playgroud)
这是可能的,如果是这样,我该怎么做呢?我试图使它成为对象本身可以管理自己和所有其他相同类型的对象.所以没有人使用这个类必须担心管理它.
我使用一个Handler,它发布了一些Runnablevia postDelayed(r, DELAY_TIME),但我需要Runnables在发布新的via之前执行所有操作postDelayed.
任何好的想法如何尽可能简单地实现这一点?
编辑:
我希望它基本上像这样:
Runnable r = new Runnable() {
// Do some fancy action
};
if (mHandler.runnablesScheduled) {
mHandler.flushAllScheduledRunnables();
}
mHandler.postDelayed(r, DELAY);
Run Code Online (Sandbox Code Playgroud) 我已经阅读了一些关于哪个线程调用各种回调方法的讨论,例如与Sensors相关的回调方法.大多数人声称UI线程调用回调 - 即使涉及单独的工作线程.我们对此有所了解吗?
请考虑以下情形:单独的类实现Runnable和SensorListener.UI线程(在onCreate期间)启动runnable,然后返回其他业务.现在独立的工作线程在其自己的类中注册SensorListener.
请注意,UI线程永远不会与SensorManager或SensorListener进行任何交互.唯一涉及与Sensor有关的线程,以及它所知道的唯一类和成员方法,是工作线程及其类.
我很难想象UI线程会在这种情况下调用回调.然而,在线讨论非常"自信".有人知道吗?
谢谢!
我目前有一个相当简单的 SSL 服务器/客户端项目,涉及标准 Java 后端和 Android 前端。我想在与客户端发送数据后尝试读取服务器的响应。然而,我遇到了一个小问题。服务器并不总是响应,因此我必须以某种方式尝试以异步方式获取响应。(因为 read() 方法是一个阻塞方法)经过一番折腾后,我找到了一个可行的解决方案,但对我来说似乎很奇怪,就像我在做一些可能“危险”的事情。我做的第一件事是创建一个新的 Runnable 和 Thread 对象:
// "reader" is of type "BufferedReader"
Runnable receiveResponse = new Runnable() {
boolean stop = false;
@Override
public void run() {
try {
new Timer().schedule(new TimerTask() {
@Override
public void run() {
stop = true;
}
}, 5000);
char receive;
StringBuilder responseBuilder = new StringBuilder();
while (!stop && ((receive = (char) reader.read()) != END_OF_STREAM_CHAR)) {
responseBuilder.append(receive);
}
// If the server responds in time I can continue …Run Code Online (Sandbox Code Playgroud)