AsyncTask 的线程池

什么是线程池 ?

使劲电我,充电


AsyncTask实现线程池方法:列举三种常用

/** 每次只执行一个任务的线程池 */
    private static ExecutorService singleTaskExecutor = Executors.newSingleThreadExecutor();// 每次只执行一个线程任务的线程池
    
    /** 每次执行限定个数个任务的线程池 */
    private static ExecutorService limitedTaskExecutor = Executors.newFixedThreadPool(3);// 限制线程池大小为3的线程池
    
    /** 所有任务都一次性开始的线程池 */
    private static ExecutorService allTaskExecutor = Executors.newCachedThreadPool(); // 一个没有限制最大线程数的线程池

创建不同的线程池服务,创建task

  AsyncTask task = new AsyncTask();

添加到线程池,一行代码

  task.executeOnExecutor(limitedTaskExecutor);

整个 添加线程池的操作已经完成。


常见问题,

1,如何取消 stop Task?

     分两种情况,

     (1), 如果线程还未run,直接调用

     task.cancel(true);
     (2), 如果线程已经run起来,执行到doInBackground中,此时调用task.cancel(true)一般情况下是无效。此时需要通过标记位,跳出循环,结束线程

 protected Object doInBackground(Object... x) {
    while (/* condition */) {
      // work...
      if (isCancelled()) break;
    }
    return null;
 }
       task调用cancel()一般情况下无效的原因如下,java Thread  interrupt doc

      

interrupt
public void interrupt()
Interrupts this thread.
Unless the current thread is interrupting itself, which is always permitted, the checkAccess method of this thread is invoked, which may cause a SecurityException to be thrown.

If this thread is blocked in an invocation of the wait(), wait(long), or wait(long, int) methods of the Object class, or of the join(), join(long), join(long, int), sleep(long), or sleep(long, int), methods of this class, then its interrupt status will be cleared and it will receive an InterruptedException.

If this thread is blocked in an I/O operation upon an interruptible channel then the channel will be closed, the thread's interrupt status will be set, and the thread will receive a ClosedByInterruptException.

If this thread is blocked in a Selector then the thread's interrupt status will be set and it will return immediately from the selection operation, possibly with a non-zero value, just as if the selector's wakeup method were invoked.

If none of the previous conditions hold then this thread's interrupt status will be set.

Interrupting a thread that is not alive need not have any effect.

Throws:
SecurityException - if the current thread cannot modify this thread

     换而言之,如果线程走在wait(),join(),sleep(),io数据流操作,调用该方法会抛出异常,这时候捕获异常,也可以终止Thread。

2,如何暂停task?而不是取消task,如上传操作,暂停后可以继续开始,实现思路在stop的基础上再来层循环

while(false == finished) { 
        while(true == paused) { 
        // 暂停下载 
          Thread.sleep(500); 
        } 
        ....
} 






  

  

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
异步任务(AsyncTask)和线程池都是将网络操作放到子线程中执行的常用方式。 1. AsyncTask方式 使用AsyncTask时需要重写其doInBackground()方法,在其中执行耗时操作,例如网络请求。然后可以在onPostExecute()方法中更新UI界面。 下面是一个使用AsyncTask进行网络请求的例子: ``` public class MyAsyncTask extends AsyncTask<String, Void, String> { @Override protected String doInBackground(String... params) { String url = params[0]; String result = ""; try { URL urlObj = new URL(url); HttpURLConnection conn = (HttpURLConnection) urlObj.openConnection(); conn.setRequestMethod("GET"); conn.setConnectTimeout(5000); conn.setReadTimeout(5000); if (conn.getResponseCode() == 200) { InputStream is = conn.getInputStream(); ByteArrayOutputStream bos = new ByteArrayOutputStream(); byte[] buffer = new byte[1024]; int len; while ((len = is.read(buffer)) != -1) { bos.write(buffer, 0, len); } result = new String(bos.toByteArray()); bos.close(); is.close(); } conn.disconnect(); } catch (Exception e) { e.printStackTrace(); } return result; } @Override protected void onPostExecute(String result) { // 在这里更新UI界面 super.onPostExecute(result); } } ``` 2. 线程池方式 线程池是一个管理线程的容器,可以创建多个线程,将任务分配给这些线程执行。这样可以避免频繁地创建和销毁线程,提高了线程的利用率。 下面是一个使用线程池进行网络请求的例子: ``` public class MyThreadPool { private static ExecutorService executorService = Executors.newFixedThreadPool(5); public static void execute(Runnable runnable) { executorService.execute(runnable); } } public class MyRunnable implements Runnable { private String url; public MyRunnable(String url) { this.url = url; } @Override public void run() { String result = ""; try { URL urlObj = new URL(url); HttpURLConnection conn = (HttpURLConnection) urlObj.openConnection(); conn.setRequestMethod("GET"); conn.setConnectTimeout(5000); conn.setReadTimeout(5000); if (conn.getResponseCode() == 200) { InputStream is = conn.getInputStream(); ByteArrayOutputStream bos = new ByteArrayOutputStream(); byte[] buffer = new byte[1024]; int len; while ((len = is.read(buffer)) != -1) { bos.write(buffer, 0, len); } result = new String(bos.toByteArray()); bos.close(); is.close(); } conn.disconnect(); } catch (Exception e) { e.printStackTrace(); } // 在这里更新UI界面 } } ``` 使用线程池时,需要先创建一个ExecutorService对象,然后通过execute()方法提交任务。在任务的run()方法中执行网络请求,并在其中更新UI界面。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值