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.条件对象

原文地址:https://www.cnblogs.com/Fill/p/9359229.html

时间: 2024-10-10 16:15:26

Java同步—线程和进程的相关文章

同步线程和进程间的通信

最近回去学习了一下进程和进程间的通信,有时候很多东西久不看了也就一下子忘了== 这里面有好几个互斥对象使用线程的 1 void mListText(CString str) 2 { 3 m_list_text.AddString(str); 4 m_list_text.SendMessage(WM_VSCROLL, SB_PAGEDOWN, 0); 5 } 6 7 8 9 DWORD WINAPI Thread1(LPVOID lpParameter) 10 { 11 //GetDlgItem(

Java中线程和进程的区别是什么呢?

概念部分:1.进程是系统资源分配的最小单位,线程是CPU执行调度的最小单位(资源调度的最小单位) 2.进程有自己的独立地址空间,每启动一个进程,系统就会为它分配地址空间,建立数据表来维护代码段.堆栈段和数据段,这种操作非常昂贵.而线程是共享进程中的数据的,使用相同的地址空间,因此CPU切换一个线程的花费远比进程要小很多,同时创建一个线程的开销也比进程要小很多. 3.线程之间的通信更方便,同一进程下的线程共享全局变量.静态变量等数据,而进程之间的通信需要以通信的方式(IPC)进行.不过如何处理好同

Java同步—线程锁和条件对象

线程锁和条件对象 在大多数多线程应用中,都是两个及以上线程需要共享对同一数据的存取,所以有可能出现两个线程同时访问同一个资源的情况,这种情况叫做:竞争条件. 在Java中为了解决并发的数据访问问题,一般使用锁这个概念来解决. 有几种机制防止代码收到并发访问的干扰: 1.synchronized关键字(自动创建一个锁及相关的条件) 2.ReentrantLock类+Java.util.concurrent包中的lock接口(在Java5.0的时候引入) ReentrantLock的使用 publi

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

1, 线程的概念 进程与线程 进程:每个进程都有独立的代码和数据空间(进程上下文),进程间的切换会有较大的开销,一个进程包含1--n个线程.(进程是资源分配的最小单位) 线程:同一类线程共享代码和数据空间,每个线程有独立的运行栈和程序计数器(PC),线程切换开销小.(线程是cpu调度的最小单位) 切换而不是同步 一个程序中的方法有几条执行路径, 就有几个线程 Java中线程的生命周期 Java线程具有五中基本状态 新建状态(New):当线程对象对创建后,即进入了新建状态,如:Thread t =

Java并发编程:进程和线程

.title { text-align: center } .todo { font-family: monospace; color: red } .done { color: green } .tag { background-color: #eee; font-family: monospace; padding: 2px; font-size: 80%; font-weight: normal } .timestamp { color: #bebebe } .timestamp-kwd

java线程,进程,多线程

(1)线程和进程 通俗一点,进程就是一个应用程序在处理机上的一次执行过程,它是一个动态的概念,而线程是进程中的一部分,进程包含多个线程在运行. (2)java中实现线程的两种方式,第一种是继承Thread类,和实现Runnable接口.由于java是单继承,所以在使用多线程的时候使用第二种方法较为合适. (3)线程的生命周期 线程的其中状态,分别为出生状态,就绪状态,运行状态,等待状态,休眠状态,阻塞状态和死亡状态.出生状态是线程创建时候的状态,在用户调用start()方法之前都是出生状态,当用

【Java】线程并发、互斥与同步

网络上对于线程的解析总是天花龙凤的,给你灌输一大堆概念,考研.本科的操作系统必修课尤甚,让你就算仔细看完一大堆文章都不知道干什么. 下面不取网站复制粘贴,在讲解自己的Java线程并发.互斥与同步之前先给大家解构操作系统书中那些给出书者为了出书者而写的废话到底是什么意思. 大神们如果只想看程序,可以自行跳过,反正我的文章从来新手向,不喜勿看. 一.线程的基本概念 其实线程的概念非常简单,多一个线程,就多了一个做事情的人. 比如搬东西,搬10箱货物,这就是所谓的一个进程,一个人,就是所谓的一个线程,

JAVA 并发编程-线程与进程的由来(一)

在学习Java编程之初,我们就接触过Java线程,当时敲过代码也总结过,但是现在看来还是有点缺陷,并没有联系线程的由来来说明问题,只是简单的介绍了什么是进程,什么是线程,以及它们之间的关系-<Java-线程>.今天我们从进程和线程的由来来补充一下之前的总结. 参考:http://www.cnblogs.com/dolphin0520/p/3910667.html 一.操作系统中为什么会出现进程? 说起进程的由来,我们需要从操作系统的发展历史谈起. 最初计算机: 也许在今天,我们无法想象在很多年

Java多线程基础:进程和线程之由来

在前面,已经介绍了Java的基础知识,现在我们来讨论一点稍微难一点的问题:Java并发编程.当然,Java并发编程涉及到很多方面的内容,不是一朝一夕就能够融会贯通使用的,需要在实践中不断积累.由于并发肯定涉及到多线程,因此在进入并发编程主题之前,我们先来了解一下进程和线程的由来,这对后面对并发编程的理解将会有很大的帮助. 下面是本文的目录大纲: 一.操作系统中为什么会出现进程? 二.为什么会出现线程? 三.多线程并发 若有不正之处,请多多谅解并欢迎指正. 请尊重作者劳动成果,转载请标明原文地址: