Java 并发并行, 新起线程方式

2020-05-12  本文已影响0人  攻城狮托马斯

进程和线程的区别


进程是操作系统进行资源分配的最小单位. 资源有(内存, I/O)等

线程是CPU调动执行任务的最小单位,线程必须依赖于进程存在. 一个CPU的内核可以执行一个线程。

CPU时间调度算法


一次切换线程会导致20000CPU周期, 时间调度算法在之前写过的一篇文章里有

https://www.jianshu.com/writer#/notebooks/43362804/notes/61179958

并行和并发的区别(Parallel & Concurrent)


并行:同时可以进行的任务数,几个CPU可以同时几个任务,同时处理任务

并发:一个CPU在一定时间内可以完成哪几个任务。

并行/多线程的好处: 充分利用CPU资源,增加响应时间, 使代码模块化,异步化,简单化。

多线程/高并发的挑战:

1.对数据产生竞争,产生死锁,抢锁竞争

2.OS限制: 每一个线程需要栈空间(1MB),用于储存将要使用数据的指针。因此每开一个线程会消耗大量的资源. mySQL的线程在150-250之间.

新启线程的方式


private static class UseThread extends Thread{ // 对线程的抽象

@Override

    public void run() {

super.run();

        System.out.println("I extends thread")

}

}

private static class UseRunnable implements Runnable { // 对任务,业务逻辑的抽象

@Override

    public void run() {

System.out.println("I implements Runnable");

    }

}

Thread和Runnable的不同:

Thread拓展Thread类,只能拓展一次,而基于runnable的线程可以实现多个接口。

Thread属于thread,而runnable用于实现业务逻辑.

通常, 如果需要创建thread, 那就拓展thread类, 而如果需要实现业务逻辑,则实现runnable,

然后把runnable object当作参数传到不同的thread initialization中去,此时runnable中的数据在多个线程中共享。

ex.

ImplementRunnable r1 = new ImplementRunnable();

Thread t1 = new Thread(r1, "张三");

Thread t2 = new Thread(r1, "lisi");

t1.start();

t2.start();

这时候, t1和t2两个thread同时运行runnable中的逻辑,并且共享其中的数据.

如果直接运行runnable(),这样的话只会当做普通的对象方法执行,并不会创建一个新线程。也就是说程序得等到r2.run()方法执行后,才执行r1.run()。。。

FutureTask, 实现RunnableFuture的接口,

对于具体的 Runnable 或者 Callable 任务的执行结果进行取消、查 询是否完成、获取结果。

Callable和Runnable的区别


相同点:  1、两者都是接口2、两者都需要调用Thread.start启动线程 

 不同点:1、如上面代码所示,callable的核心是call方法,允许返回值,runnable的核心是run方法,没有返回值2、call方法可以抛出异常,但是run方法不行3、因为runnable是java1.1就有了,所以他不存在返回值,后期在java1.5进行了优化,就出现了callable,就有了返回值和抛异常4、callable和runnable都可以应用于executors。

Stop vs.Interrupt()


不建议使用:

Stop(): 不会释放线程占有资源

应该使用:

Interrupt(): 给线程打招呼,不会强制关掉线程,线程可以不理会.

在JDK中,线程是协作式的,而不是抢占式的,也可以通过isInterrupted来检查是否需要强制暂停线程。

上一篇 下一篇

猜你喜欢

热点阅读