2020-10-08

1、通过继承Thread类或者实现Runnable接口去实现
class TheadTask extends Thread{
@Override
public void run() {
Log.d(“MainActivity”,“TheadTask is running”);
}
}

class ThreadRunnable implements Runnable{

    @Override
    public void run() {
        Log.d("MainActivity","ThreadRunnable is running");
    }

1
2
3
4
5
6
7
8
9
10
11
12
13
//用继承自Thread方式来实现多线程
Thread task01=new TheadTask();
task01.start();

    Thread task02=new TheadTask();
    task02.start();
    //用实现Runnable方式来实现多线程
    Thread task03=new Thread(new TheadTask());
    task03.start();

1
2
3
4
5
6
7
8
9
两种方式的区别:runnable是通过接口方式去实现的,因此可以用多个类去实现这个接口,通过接口,实现线程之间的数据共享。一般继承自Thread的无法共享数据。

2、通过线程池去实现
//复用线程池的方式实现
ExecutorService executorService = Executors.newCachedThreadPool();
executorService.execute(new ExecutorServiceThread());

    //该线程池只有一个线程
    ExecutorService singleExecutorService = Executors.newSingleThreadExecutor();
    singleExecutorService.execute(new ExecutorServiceThread());

1
2
3
4
5
6
7
class ExecutorServiceThread implements Runnable{

    @Override
    public void run() {
        Log.d("MainActivity","ExecutorServiceThread is running");
    }
}

1
2
3
4
5
6
7
线程池里面可以使用已经创建好的线程,可以减少线程销毁创建时给程序带来的开销,当遇见调用频繁的任务时可以采用线程池的方式去实现

3、通过继承AsyncTask实现
//目前谷歌弃用了,但是一些多线性框架还在使用
/**
* 第一个参数 doInBackground参数
* 第二个参数onProgressUpdate的参数,如果不需要可以设为void
* 第三个参数doInBackground返回值,onPostExecute的参数
*/
class DownloadTask extends AsyncTask<String, Integer, String> {
@Override
protected void onPreExecute() {
//在异步任务开始的时候准备资源
super.onPreExecute();
}

    //必须要实现
    @Override
    protected String doInBackground(String... strings) {
        //执行复杂耗时的任务,一定要慎用
        for (int i=0;i<100;i++){
            publishProgress(i);//如果不需要发布进度,可以不处理
        }
        return "AsyncTask任务";
    }



    @Override
    protected void onProgressUpdate(Integer... values) {
        //更新进度,如果不需要的可以不实现,将第二个参数置空即可
        super.onProgressUpdate(values);
    }

    @Override
    protected void onPostExecute(String s) {
        //在这里处理数据更新后的结果
        super.onPostExecute(s);
    }
}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
//AsyncTask去执行
DownloadTask downloadTask=new DownloadTask();
//默认是串行,所以需要修改成并行
downloadTask.executeOnExecutor(
AsyncTask.THREAD_POOL_EXECUTOR,
“www.baidu.com”
);
1
2
3
4
5
6
7
很遗憾的是,AsyncTask在现在已经是被谷歌弃用了,在使用AsyncTask的时候也要时刻注意防止内存泄露,同时AsyncTaks默认是串行方式去执行任务的,因此当有多个任务的时候,需要设置为并行方式 executeOnExecutor,AsyncTask.THREAD_POOL_EXECUTOR,去提高效率。虽然现在已经被弃用,但是一些多线程框架还是在使用,因此多了解一下没有坏处。

4、通过handle实现

    //handle去执行
    Handler handler=new Handler(Looper.myLooper());
    handler.post(new Runnable() {
        @Override
        public void run() {
            Log.d("MainActivity","handler is running");
        }
    });

1
2
3
4
5
6
7
8
9
handle一般用于主线程中,主线程调用handle,子线程负责处理请求数据,然后更新ui

5、通过IntentService实现
class TaskIntentService extends IntentService{

    /**
     * @param name
     * @deprecated
     */
    public TaskIntentService(String name) {
        super(name);
    }

    @Override
    protected void onHandleIntent(@Nullable Intent intent) {
       //处理任务
        for (int i= 0;i<100;i++) {
            try {
                Thread.sleep(100);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            sendProgress(i, 100);
        }
        Log.d("MainActivity","onHandleIntent");

    }
    private void sendProgress(int currentProgress,int totalProgress) {
        //得到处理后的通知可以用广播去通知
        Intent intent = new Intent();
        intent.setAction("xxxxxxx");
        intent.putExtra("current", currentProgress);
        intent.putExtra("total", totalProgress);
        sendBroadcast(intent);
    }

}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
IntentService这个在当前中也被谷歌弃用了,这是一个服务,在执行任务结束后服务生命周期就会结束(可查看源码,当onHandleIntent结束时就会调用终止函数),因此不适合去处理一些需要持续记录数据的操作

总结
看了前面这么多种安卓内置的多线程操作后,感兴趣的也可以去研究一下框架Rxjava,在线程中处理还算是可以的。创作不易,请勿下次一定。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
这是一个 SQL 语句,用于向借阅表中插入数据。该表包含以下字段:借阅编号、读者编号、书籍编号、借阅日期、归还日期、借阅状态。每条数据表示一次借阅记录。其中借阅编号、读者编号、书籍编号、借阅日期和借阅状态是必填项,归还日期为可选项,如果借阅状态为“已还”则必须填写归还日期。 具体插入的数据如下: - 借阅编号:100001,读者编号:123413,书籍编号:0001,借阅日期:2020-11-05,归还日期:NULL,借阅状态:借阅 - 借阅编号:100002,读者编号:223411,书籍编号:0002,借阅日期:2020-9-28,归还日期:2020-10-13,借阅状态:已还 - 借阅编号:100003,读者编号:321123,书籍编号:1001,借阅日期:2020-7-01,归还日期:NULL,借阅状态:过期 - 借阅编号:100004,读者编号:321124,书籍编号:2001,借阅日期:2020-10-09,归还日期:2020-10-14,借阅状态:已还 - 借阅编号:100005,读者编号:321124,书籍编号:0001,借阅日期:2020-10-15,归还日期:NULL,借阅状态:借阅 - 借阅编号:100006,读者编号:223411,书籍编号:2001,借阅日期:2020-10-16,归还日期:NULL,借阅状态:借阅 - 借阅编号:100007,读者编号:411111,书籍编号:1002,借阅日期:2020-9-01,归还日期:2020-9-24,借阅状态:已还 - 借阅编号:100008,读者编号:411111,书籍编号:0001,借阅日期:2020-9-25,归还日期:NULL,借阅状态:借阅 - 借阅编号:100009,读者编号:411111,书籍编号:1001,借阅日期:2020-10-08,归还日期:NULL,借阅状态:借阅
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值