Java 线程详解
来源:互联网 发布:centos虚拟机安装 编辑:程序博客网 时间:2024/05/16 05:18
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{@Overridepublic 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 0B synchronized loop 0A synchronized loop 1B synchronized loop 1A synchronized loop 2B synchronized loop 2A synchronized loop 3B synchronized loop 3A synchronized loop 4B synchronized loop 4
想锁住很简单,直接锁定这个类不就行了:
<span style="color:#362e2b;">package com.liang.ThreadDemo;public class SynchronizedTest implements Runnable{@Overridepublic 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 0A synchronized loop 1A synchronized loop 2A synchronized loop 3A synchronized loop 4B synchronized loop 0B synchronized loop 1B synchronized loop 2B synchronized loop 3B synchronized loop 4只改了红色的部分,就是锁住怎个类了,当然加在方法上的,若把方法改成static静态类,那么也是锁住怎个类。
- Java线程详解
- Java 线程 详解
- Java线程详解[转]
- Java 线程 详解
- Java之线程详解
- java 线程详解
- java 线程详解
- Java线程安全详解
- java线程thread详解
- Java线程详解
- java 线程详解
- Java 线程部分详解
- Java线程详解
- java 线程池详解
- Java线程详解
- java线程详解
- java线程池详解
- java 线程池 详解
- 常用的adb 命令
- 编程能力与编程年龄
- MFC子线程
- pring配置详解-连接池配置(转载)
- android_RIL结构分析与移植
- Java 线程详解
- java邮件发送名词解释
- IOS开发苹果官方Sample Code及下载地址
- 前台技术纪要
- Play with Floor and Ceil - UVa 10673
- 算法之费氏数列
- 数据结构中散列表的复习笔记
- 获取hibernate的Session
- 遗传算法解决0-1背包问题