Java同步—线程和进程

Posted fill

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java同步—线程和进程相关的知识,希望对你有一定的参考价值。

进程和线程

1.线程和进程的定义

进程定义:一个程序在一个数据集上的一次动态执行过程。

简单来说:

如果把进程比喻成桌子,线程比喻成人,程序比喻成吃饭

1.单进程单线程:一个人在一个桌子上吃饭

2.单进程多线程:一堆人在一张桌子上一起吃饭

3.多进程多线程:每个人在自己的桌子上吃饭

单进程多线程的问题是:大家容易争抢,造成一些问题。

多进程多线程的问题是:各吃各的挺好,但是彼此聊天不方便。

Windows:开桌子花销大,因此鼓励大家在一个桌子上吃饭,所以Windows多线程的学习重点是解决资源争抢和同步的方法。

Linux:开桌子花销小,因此鼓励每个人在自己的桌子吃饭,但是彼此聊天不方便,所以Linux下多线程的学习重点是进程间通讯的方法。

PS:做一个实验,创建一个进程,写入若干数据、再读出数据,最后退出,重复1000次。(创建和销毁进程1000次)

Linux:0.8s

Windows:79.8s

所以Windows开桌子的效率是Linux的100倍左右.

多线程和多进程的本质区别:每一个进程拥有自己的一整套变量,而多线程则共享进程中的数据.

多线程是线程控制的简写.

2.Java中的多线程

线程可以有以下六种状态:

1.New(新创建的)

2.Runnable(可运行的)

3.Blocked(被阻塞的)

4.Waiting(等待)

5.Timed waiting(计时等待)

6.Terminated(被终止)

新建一个线程的时候,线程的状态是New

一旦调用start方法,线程处于Runnable状态,表示可以被运行。

当操作系统给线程提供运行的时间的时候,则该线程进入运行状态。

但是,线程开始运行之后,不会一直保持运行,有的时候会被中断给其他线程提供运行机会(多线程)。这个状态一般都是Waiting或者Timed waiting状态,如果是Timed waiting状态,在计时结束后,会根据线程的优先级重新让其进入运行状态。

线程也可能因为其他线程被堵塞,进入Blocked状态(目的是同步数据,不造成数据混乱)。

有两种情况,系统会被终止,进入Terminated状态,第一种是run方法执行完毕,线程正常结束。第二种是一个没有捕获的异常终止了run方法。

PS:原来我们可能用过stop方法来终止一个线程,但是现在该方法已经被弃用,尽量不要在自己的程序中使用它。

3.线程优先级

在Java中,每一个线程都有一个优先级,默认情况下,一个线程继承他父线程的优先级,但是可以用setPriority方法提高或降低优先级,优先级在1—10之间,最高是10,最低是1.

当线程调度器暂停或结束当前线程的任务,选择新线程之行时,它首先选择具有较高优先级的线程。

不要让程序中功能的调度过分依赖于优先级,应该注意以下问题:当几个高优先级的线程没有进入非活动状态的时候,低优先级的线程永远不可能执行。

4.守护线程(daemon thread)

Java中有一种很特殊的线程,叫做守护线程,这个线程就一个用途:为其他线程提供服务,计时线程就是一个例子,它会定时发送信号给其他线程或清空过时的缓存。当一个应用程序中只剩下守护线程的时候,虚拟机就会退出,因为如果只剩下守护线程,就没必要继续运行程序了。

使用守护线程需要考虑以下的问题:永远不要使用守护线程去访问资源,如:文件、数据库,因为它可能会在任何时候中断。

设置一个线程为守护线程的方法很简单:调用线程的setDaemon方法就ok了,传递一个bool值,值得注意的是,该方法必须在线程启动前调用。

5.条件对象

以上是关于Java同步—线程和进程的主要内容,如果未能解决你的问题,请参考以下文章

Java之线程,常用方法,线程同步,死锁

Java中的线程同步与异步如何理解?

java基础:多线程

什么是java的线程安全?同步,异步

java面试必问:多线程的实现和同步机制,一文帮你搞定多线程编程

java面试必问:多线程的实现和同步机制,一文帮你搞定多线程编程