Java并发编程-总结-01-10

一、什么是并发?

并发是一个程序同时执行多个计算的能力。这可以通过把计算分布在一个机器可用的CPU内核上或者甚至在同一网络上的不同的机器来实现。

二、进程和线程的区别是什么?

进程:进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动,进程是系统进行资源分配和调度的一个独立单位.

线程:线程是进程的一个实体,是CPU调度和分派的基本单位

进程与线程的区别:

1、进程有独立的地址空间和独立的内存单元,线程有自己的堆栈和局部变量,但线程之间没有单独的地址空间。

2、线程更轻量级。在Java中,进程对应于虚拟机(JVM),线程存活在进程里,运行时线程可以动态地被虚拟机创建和停止.

三、什么是调度器?

调度器是在有限资源中,例如处理器或者I/O通道,管理进程和线程调度算法的一种实现。绝大多数调度算法的目标是为可使用的进程和线程提供一些负载平衡,以保证每个进程或线程可以在适当的时间内接触到需要的资源。

四、如何在Java创建线程?

每个Java项目都是在主线程里运行,因此,一个Java至少有一个线程。

Java在语言层面实现线程的方式:

1、实现Runnable接口,调用Thread实例化

2、继承Thread类

两者的区别和联系:

1、Thread类是Runnable接口的一个实现子类

2、Runnable接口的优势,避免单继承的局限,一个类可以继承多个接口

3、Runnable接口只有一个抽象的run方法,也就是说Runnable接口本身不支持多线程

五、每一个Java线程有哪些特性以及如何访问当前线程?

1、线程的基本属性

在JVM里类型为长整数的唯一标识符 ,线程ID:thread.getId();

类型为字符型的名字 ,线程名称:thread.getName();

类型为整数的优先级,priority : thread.getPriority();

java.lang.Thread.State的状态 : thread.getState();

线程所属的线程组 :thread.getThreadGroup();

2、线程组

每个线程都属于一个线程组. The JDK classjava.lang.ThreadGroup 提供了一些方法去处理一整个线程组。我们可以用这些方法,例如去中断全部线程或者调整它们的优先级

3、优先级

一个线程的优先级使用方法setPriority(int)设置。设置优先级为最大值,我们使用常数Thread.MAX_PRIORITY和设置它的最小值我们使用常数Thread.MIN_PRIORITY因为这些值可以在不同的JVM的实现之间有差异。

4、线程状态

  • NEW: 线程还没有开始的状态.
  • RUNNABLE: 线程正运行在虚拟机的状态.
  • BLOCKED: 线程被堵塞正等待监控锁的状态.
  • WAITING: 线程正在等待另外一个线程执行某个特定动作.
  • TIMED_WAITING: 一个线程在指定的等待时间里等待另一个线程执行某个动作.
  • TERMINATED: 线程已经退出了的状态.

5、如何访问当前线程?

thread.currentThread();返回的是当前线程对象


六、线程的停止

Java提供了很丰富的API但没有为停止线程提供API。JDK 1.0本来有一些像stop(), suspend() 和resume()的控制方法。但是由于潜在的死锁威胁因此在后续的JDK版本中他们被弃用了,之后Java API的设计者就没有提供一个兼容且线程安全的方法来停止一个线程。

注意:当run() 或者call() 方法执行完的时候线程会自动结束。

1、如何手动停止一个线程?

一个线程可以被其他线程设置指向当前线程的volatile引用为空,表示当前线程停止执行。

2、stop函数的问题

一个线程不应该用java.lang.thread过时的方法stop()来停止,当调用此方法时,该线程解锁它所有的锁了。如果被释放的锁所保护的某对象处于不一致的状态,这种状态会对其他线程可见。其他线程的工作在这不一致状态的对象上可能发生任意不可预测的行为。

七、什么是守护线程?

1、什么是守护线程?

守护线程是相对于用户线程而言的。守护线程是当JVM决定它是否应该停止时执行状态不运行的线程。当所有的用户线程(相对于守护线程)终止,JVM停止。守护线程可以用来作为监控功能,当所有用户线程停止时,JVM会停止守护线程。一个典型的守护线程是Java的垃圾回收器。

2、如何设置守护线程?

一般是在线程运行之前设置thread.setDaemon(true)。最好在构造函数里面设置。

3、有可能当一个普通用户线程已经开始了,将它转为守护线程吗?

当一个用户线程一旦开始了,它不能转变为守护线程. 在一个运行线程上调用方法thread.setDaemon(true)会导致IllegalThreadStateException。

八、能否启动一个线程两次?

不,通过调用其方法start()启动一个线程后,第二调用start()将抛出一个illegalthreadstateexceptio

九、什么是线程安全?
如果你的代码所在的进程中有多个线程在同时运行,而这些线程可能会同时运行这段代码。如果每次运行结果和单线程运行的结果是一样的,而且其他的变量的值也和预期的是一样的,就是线程安全的。一个线程安全的计数器类的同一个实例对象在被多个线程使用的情况下也不会出现计算失误。很显然你可以将集合类分成两组,线程安全和非线程安全的。Vector 是用同步方法来实现线程安全的, 而和它相似的ArrayList不是线程安全的。

十、线程的唤醒

java.lang.Thread 的方法interrupt() 可以中断睡眠线程.

interrupted() 和isInterrupted()的主要区别:

前者会将中断状态清除而后者不会。Java多线程的中断机制是用内部标识来实现的,调用Thread.interrupt()来中断一个线程就会设置中断标识为true。当中断线程调用静态方法Thread.interrupted()来检查中断状态时,中断状态会被清零。而非静态方法isInterrupted()用来查询其它线程的中断状态且不会改变中断状态标识。简单的说就是任何抛出InterruptedException异常的方法都会将中断状态清零。无论如何,一个线程的中断状态有可能被其它线程调用中断来改变。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值