java线程

来源:互联网 发布:电脑包什么牌子好 知乎 编辑:程序博客网 时间:2024/05/16 16:09

1、线程的名字,一个运行中的线程总是有名字的,名字有两个来源,一个是虚拟机自己给的名字,一个是你自己的定的名字。在没有指定线程名字的情况下,虚拟机总会为线程指定名字,并且主线程的名字总是mian,非主线程的名字不确定。

2、线程都可以设置名字,也可以获取线程的名字,连主线程也不例外。

3、获取当前线程的对象的方法是:Thread.currentThread()

4、在上面的代码中,只能保证:每个线程都将启动,每个线程都将运行直到完成。一系列线程以某种顺序启动并不意味着将按该顺序执行。对于任何一组启动的线程来说,调度程序不能保证其执行次序,持续时间也无法保证。

5、当线程目标run()方法结束时该线程完成。

6、一旦线程启动,它就永远不能再重新启动。只有一个新的线程可以被启动,并且只能一次。一个可运行的线程或死线程可以被重新启动。

7、线程的调度是JVM的一部分,在一个CPU的机器上上,实际上一次只能运行一个线程。一次只有一个线程栈执行。JVM线程调度程序决定实际运行哪个处于可运行状态的线程。

线程的几种状态:

在Java当中,线程通常都有五种状态,新建、就绪、运行、阻塞和死亡。

新建状态:在生成线程对象,并没有调用该对象的start方法,这是线程处于创建状态。

就绪状态:当调用了线程对象的start方法之后,该线程就进入了就绪状态,但是此时线程调度程序还没有把该线程设置为当
前线程,此时处于就绪状态。在线程运行之后,从等待或者睡眠中回来之后,也会处于就绪状态。

运行状态:线程调度程序将处于就绪状态的线程设置为当前线程,此时线程就进入了运行状态,开始运行run函数当中的代码。

阻塞状态:线程正在运行的时候,被暂停,通常是为了等待某个时间的发生(比如说某项资源就绪)之后再继续运行。
sleep,suspend,wait等方法都可以导致线程阻塞。

死亡状态:如果一个线程的run方法执行结束或者调用stop方法后,该线程就会死亡。对于已经死亡的线程,无法再使用start方法令其进入就绪状态。


多个线程访问同一资源时,容易出现资源冲突的问题。解决这种问题可以使用synchronized关键字

synchronized的作用域有两种:实例范围和类范围。

实例范围同步方法:可以防止多个线程同时访问这个对象实例的synchronized方法(如果一个对象有多个synchronized方法,只要一个线程访问了其中的一个synchronized方法,其它线程不能同时访问这个对象中任何一个synchronized方法)。这时,不同的对象实例的synchronized方法是不相干扰的。也就是说,其它线程照样可以同时访问相同类的另一个对象实例中的synchronized方法。

实例范围同步块:表示只对这个区块的资源实行互斥访问,它的作用域是当前对象。

类范围的同步方法:synchronized static aStaticMethod{}防止多个线程同时访问这个中的synchronized static 方法。它可以对类的所有对象实例起作用。也就是说在一个JVM中,同一时间最多有一个该类的静态同步方法在执行。这样的方法可以应用到多线程的同步中,实现各线程直接的数据共享和互动。

类范围同步块:在static 方法内加同步区块:sychronized (类名.class) { /*区块*/}

注意:synchronized关键字是不能继承的,也就是说,基类的方法synchronized f(){} 在继承类中并不自动是synchronized f(){},而是变成了f(){}。继承类需要你显式的指定它的某个方法为synchronized方法。

进程是运行着的程序,每个进程在内存中都有自己独立的内存空间。在每个进程中,存在多个线程(一个线程是进程的一个任务序列),在只有一个CPU的计算机上,同一个时间点上只能执行一个线程。

浏览器启动加载慢的原因是CPU处理不过来。CPU处理其他线程,此浏览器中的线程没有被执行,所以无法加载


Java是为数不多的支持多线程的语言

由一个对象创建多个线程,这样,多个线程执行的是同一个对象中的run方法,操作的是同一个对象。当多个线程对象访问同一个对象的一个方法时,要注意线程问题。


0 0
原创粉丝点击