首页 > 代码库 > Java 线程详解
Java 线程详解
java使用线程的两种方法:
1.继承Thread
2.实现Runnable
线程中的一些方法:
wait():
Object类的方法,对此对象调用wait方法导致本线程放弃对象锁,进入等待此对象的等待锁定池,只有针对此对 象发出notify方法(或notifyAll)后本线程才进入对象锁定池准备获得对象锁进入运行状态。
sleep:
是线程类(Thread)的方法,导致此线程暂停执行指定时间,给执行机会给其他线程,但是监控状态依然保持,到时后会自动恢复。调用sleep不会释放对象锁。
yield:
称为“退让”,它把运行机会让给了同等优先级的其他线程,就是使当前运行着线程让出CPU资源,但是让给谁不知道,仅仅是让出,线程状态回到可运行状态,有可能自己刚让出,自己马上又继续执行了。
setDaemon(true):
此方法是将线程设置成守护进程。守护线程使用的情况较少,但并非无用,举例来说,JVM的垃圾回收、内存管理等线程都是守护线程。有什么用呢?当剩下的进程都是守护进程时,java虚拟机就会退出了,也就是说当非守护线程都执行完了,这个守护线程即便还没执行完,也会随着最后一个非守护进程结束而结束!
线程同步:
1.在方法上加上:synchronized 当两个并发线程访问同一个对象object中的这个方法时,一个时间内只能有一个线程得到执行。另一个线程必须等待当前线程执行完这个代码块以后才能执行该代码块。。
如:public synchronized void test(){...}
2.同步代码块:synchronized(Object){...}
注意:那么synchronized锁住的是代码还是对象呢?
synchronized锁住的是括号里的对象,而不是代码。对于非static的synchronized方法,锁的就是对象本身也就 是this。
看下面一段代码:
package com.liang.ThreadDemo; public class SynchronizedTest implements Runnable{ @Override public void run() { synchronized(this){ for (int i = 0; i < 5; i++) { System.out.println(Thread.currentThread().getName() + " synchronized loop " + i); } } } public static void main(String[] args) { SynchronizedTest t1 = new SynchronizedTest(); SynchronizedTest t2 = new SynchronizedTest(); Thread ta = new Thread(t1,"A"); Thread tb = new Thread(t2,"B"); ta.start(); tb.start(); } }结果如下:这怎么没有锁住呢?因为锁定是对象,而非代码,但是不同的对象时就锁不住了!
A synchronized loop 0 B synchronized loop 0 A synchronized loop 1 B synchronized loop 1 A synchronized loop 2 B synchronized loop 2 A synchronized loop 3 B synchronized loop 3 A synchronized loop 4 B synchronized loop 4
想锁住很简单,直接锁定这个类不就行了:
<span style="color:#362e2b;">package com.liang.ThreadDemo; public class SynchronizedTest implements Runnable{ @Override public void run() { synchronized(</span><span style="color:#ff6666;">SynchronizedTest.class</span><span style="color:#362e2b;">){ for (int i = 0; i < 5; i++) { System.out.println(Thread.currentThread().getName() + " synchronized loop " + i); } } } public static void main(String[] args) { SynchronizedTest t1 = new SynchronizedTest(); SynchronizedTest t2 = new SynchronizedTest(); Thread ta = new Thread(t1,"A"); Thread tb = new Thread(t2,"B"); ta.start(); tb.start(); } }</span>
A synchronized loop 0 A synchronized loop 1 A synchronized loop 2 A synchronized loop 3 A synchronized loop 4 B synchronized loop 0 B synchronized loop 1 B synchronized loop 2 B synchronized loop 3 B synchronized loop 4只改了红色的部分,就是锁住怎个类了,当然加在方法上的,若把方法改成static静态类,那么也是锁住怎个类。
Java 线程详解