Articles of multithreading

在构造之后设置Java Thread的Runnable

JDK 7 Java文档提出了以下两个用于创建Java线程的习惯用法: 扩展线程并覆盖run() class PrimeThread extends Thread { long minPrime; PrimeThread(long minPrime) { this.minPrime = minPrime; } public void run() { // compute primes larger than minPrime . . . } } … //And to launch the custom Thread PrimeThread p = new PrimeThread(143); p.start(); 实现Runnable并创建一个新的Thread,将Runnable impl传递给它的构造函数 class PrimeRun implements Runnable { long minPrime; […]

在事务运行时读取sqlite数据(Android)

我需要从数据库读取一些数据,同时我在一个事务的另一个线程中加载一些数据。 读取其他表的所有线程都将停止,直到其他线程中的事务完成。 我需要能够从数据库中读取信息而不必担心其他线程。 我已经阅读了很多关于sqlite,android的信息…但是没有什么工作,总是我的查询参数被阻止。 我遵循这个建议,因为@KevinGalligan在这个post中说( Android上SQLite的最佳做法是什么? )解决锁和其他问题。 1)我只使用一个SQLiteOpenHelper(单例) 2)我从未关闭数据库 我试过了: 用以下内容开始交易: database.execSQL(“begin immediate transaction”); 要么 database.beginTransactionNonExclusive(); 代替 database.beginTransaction(); 不工作,查询被阻止。 我已经读过WAL(database.enableWriteAheadLogging()),但我需要支持api 9。 同时读取事务的任何其他解决方案是更新某些表吗? 我不在乎我的信息是否被弃用,更重要的是不要阻止我的线程。

我可以杀死或完成()除UI线程以外的线程中的一个活动..?

我想知道它是否有可能创建一个线程并杀死/完成活动,是否可能,如果是的话那怎么会在AsyncTask’s doInBackGround()

新线程多次

我想按下按钮时运行一个线程 public void ButtonClick(){ Thread thread = new Thread(){ public void run(){ Log.i(“Test”, “I’m in thread”); } }; thread.start(); } 我的问题是:我想在这个按钮上点击几次。 在打印“我在线程中”消息后,是否还存在多个线程? 或者每次运行函数完成时,线程都会被销毁? 如果我创建了几个同时运行的线程,我怎样才能以干净的方式关闭它们? 谢谢你的帮助!

Android,Handler是在主线程还是其他线程中运行?

我有以下代码。 public class SplashScreen extends Activity { private int _splashTime = 5000; /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.splash); getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN); new Handler().postDelayed(new Thread(){ @Override public void run(){ Intent mainMenu = new Intent(SplashScreen.this, MainMenu.class); SplashScreen.this.startActivity(mainMenu); SplashScreen.this.finish(); overridePendingTransition(R.drawable.fadein, R.drawable.fadeout); } }, _splashTime); } } 我在分析这段代码时遇到了问题。 至于知道处理程序在主线程中运行。 […]

Android:与OpenGL渲染器线程同步

我正在使用OpenGL ES在Android应用程序中执行绘图。 我想编写一个从UI线程调用的函数,该函数将调用渲染器线程并让它读取并将图像返回给调用者。 我正在考虑使用Future,以便在呈现器线程写入图像数据时UI线程会hibernate(该操作非常快,因此用户不会觉得应用程序没有响应)。 但我对如何将Future提交给渲染器线程感到茫然。 我发现的所有示例都创建了自己的线程,然后将未来提交给这些线程。 关于GLSurfaceView的文档提到“queueEvent()方法用于在UI线程和呈现线程之间进行安全通信。如果您愿意,可以使用其他一些Java跨线程通信技术,例如Renderer类本身的synchronized方法“。 所以它看起来像使用Future而不是调用queueEvent()是可能的,但我不知道如何做到这一点。

问题与Android相机和线程安全

正如在处理相机的Android文档中所指出的 ,建议使用单独的线程来打开相机。 好吧,我这样做但确实遇到了一些困难: 对于我的相机对象,我使用的是全局实例variables。 现在,当我启动我的应用程序时,我在onResume()创建一个单独的线程,并在该线程中对该相机对象进行所有初始化。 稍后当我离开应用程序时,我会在onPause()释放相机。 这一切都很好。 但问题是 :当我做一些压力测试并在onResume()和onPause()之间切换得非常快(通过快速点击多任务按钮)我的应用程序崩溃了。 原因是有一个Method called after release()的Method called after release() 。 这是有道理的,因为可能在onPause()释放相机,但同时线程尚未完成初始化。 因此,线程尝试对已经释放的相机对象进行调用。 现在,我该怎么做才能解决这个问题? 也许不使用全球相机对象? 或者我该如何使这个线程安全?

Android SQlitemultithreading访问

我正在使用SQLiteOpenHelper在Android上编写和读取SQlite数据库。 当用户点击UI时,我使用AsyncTask从SQLite数据库中读取,但在确切的samo时刻,我正在使用其他AsyncTask更新并在后台写入数据库。 每x次我得到数据库锁定exception。 我怎样才能解决这个问题? 是否可以同时从多个线程以某种方式访问​​SQl​​ite? 我正在使用它:我有一个从SQLiteOpenHelper扩展的Database类。 我实现了onCreate和onUpgrade方法,每次我从数据库读取或写入数据库时​​我都使用SQLiteDatabase: SQLiteDatabase database = null; try { database = new Database(context).getWritableDatabase(); …. writing and reading from database… …. } catch (Exception e) { e.printStackTrace(); } finally { if (database != null) { database.close(); } } 最后,如果我使用它们,我也会关闭SQLiteStatements和Cursors。 我应该使用@Justin答案并在Application中使用单例数据库类吗? 这是我得到的错误: E/SqliteDatabaseCpp(17377): sqlite3_open_v2(“/data/data/com.skulptur/databases/LGM.s3db”, &handle, 6, NULL) failed E/SQLiteDatabase(17377): Failed to open the […]

使用Looper.getMainLooper()初始化的处理程序不响应消息回调

我正在尝试实现从不同线程监听同一个Looper的Handler。 下面我有两个处理程序,一个在主线程中创建,另一个在子线程中创建,但是两个都初始化为侦听Main Looper。 private Handler mMain; public static final ThreadPoolExecutor tpe = (ThreadPoolExecutor) Executors.newCachedThreadPool(); @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mMain = new Handler(Looper.getMainLooper()) { @Override public void handleMessage(Message msg) { Log.wtf(“”, “main:” + msg); } }; tpe.execute(new Runnable() { private Handler tChild = new Handler(Looper.getMainLooper()) { @Override public void handleMessage(Message msg) { […]

更新RecyclerView项ProgressBar而不在适配器上调用notifyItemChanged(int)

我正在尝试更新progressBar,它是其中一个RecyclerView项目的一部分。 我知道我可以用两种方式做到 方法1:通过调用notifyItemChanged(position)刷新项目行 方法2:使用LayoutMananger对象上的findViewByPosition()方法访问视图。 但不幸的是,他们都没有在我的案件中工作。 如果我使用第一个,整个项目将重新绘制,recyclerview的背景颜色为灰色,项目为白色,因此用户可以注意到整个项目刷新。 如果我尝试第二个,滚动时我会遇到问题。 我想像WhatsApp那样更新进度。 提前致谢