美文网首页
android 多线程(二)

android 多线程(二)

作者: DouMarK | 来源:发表于2019-07-24 00:15 被阅读0次

线程并发与并行

1.并发
当多线程共同使用一个CPU或只有一个CPU可用的时候,这个CPU同一时刻只能执行一个线程,所以这时候CPU会分割为多个时间段,将多个线程快速轮换。
2.并行
同一时刻,可以执行多个线程,例如读取多个磁盘文件,并行代表同一时刻,同时开启多个线程处理多个文件。
并发与并行都是由系统操控的,当系统只有一个CPU资源可用的时候,这些线程就会抢占资源,并发执行,轮流开启,当系统CPU资源空余的时候,就会并行执行,合理利用CPU资源。

Callable:

import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask;

public class TestCallable {
 
    public static void main(String[] args) {
        ThreadDemo td = new ThreadDemo();
 
        FutureTask<Integer> result = new FutureTask<>(td);
 
        new Thread(result).start();
 
        try {
            Integer sum = result.get();  
            System.out.println(sum);
            System.out.println("------------------------------------");
        } catch (InterruptedException | ExecutionException e) {
            e.printStackTrace();
        }
    }
 
}
 
class ThreadDemo implements Callable<Integer> {
 
    @Override
    public Integer call() throws Exception {
        int sum = 0;
 
        for (int i = 0; i <= 100000; i++) {
            sum += i;
        }
 
        return sum;
    }
 
}

Callable和Runnble的区别
1)Callable有返回值,Runnble无返回值。
2)Runnable可以作为Thread构造器的参数,通过开启新的线程来执行,也可以通过线程池来执行。而Callable只能通过线程池执行

线程同步通行

当多个线程共享相同的任务,并行执行并都有可能修改数据,但是当一些数据被一个线程占用的时候,另一个线程再调用并想修改时,可能会访问一个无效值,所以为了防止线程访问到无效值,我们可以给线程加锁,例如利用synchronized声明这些方法,当有其他线程在执行都有synchronized的声明方法时,都要检查有没有其它线程B(或者C、 D等)正在用这个方法(或者该类的其他同步方法),有的话要等正在使用synchronized方法的线程B(或者C 、D)运行完这个方法后再运行此线程A,没有的话,锁定调用者,然后直接运行。

public synchronized void setTest(int i){
      this.i = i;
}

如上面方法,当有线程访问的时候,就会检查有没其他线程在调用,有则进行进入等待状态,直到其他线程调用完毕。

相关文章

网友评论

      本文标题:android 多线程(二)

      本文链接:https://www.haomeiwen.com/subject/tpholctx.html