博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Java总结之线程
阅读量:5816 次
发布时间:2019-06-18

本文共 4116 字,大约阅读时间需要 13 分钟。

【线程的基本概念】
线程是一个程序内部的顺序控制流。
线程和进程的差别:
  每一个进程都有独立的代码和数据空间(进程上下文),进程间的切换会有较大的开销。
  线程能够看成是轻量级的进程,同一类线程共享代码和数据空间,每一个县城有独立的执行站和程序计数器(PC),线程切换的开销小。
  多进程:在操作系统中能同一时候执行多个任务(程序)
  多线程:在同一应用程序中有多个顺序流同一时候运行
Java的线程是通过java.lang.Thread类来实现的。
VM启动时会有一个由主方法(public static void main(){})所定义的线程。

能够通过创建Thread的实例来创建新的线程。

每一个线程都是通过摸个特定Thread对象所相应的方法run()来完毕其操作的,方法run()称为线程体。

通过调用Thread类的start()方法来启动一个线程。
【线程控制基本方法】
isAlive() 推断线程是否还“活”着。即线程是否还未终止。

getPriority() 获得线程的优先级数值
setPriority() 设置现成的优先级数值
Thread.sleep() 将当前线程睡眠指定毫秒数
join() 调用某线程的该方法。将当前线程与该线程“合并”,即等待该线程结束,再恢复当前线程的执行。
yield() 让出CPU,当前线程进入就绪队列等待调度。
wait() 当前线程进入对象的wait pool。
notify()/notifyAll() 唤醒对象的wait pool中的一个/全部等待线程。
【sleep/join/yield方法】
sleep方法
  能够调用Thread的静态方法:
  public static void sleep(long millis) throws InterruptedExcepion
  使得当前线程休眠(临时停止运行millis毫秒)
因为是静态方法,sleep能够由类名直接调用:
  Thread.sleep(...)
join方法
  合并某个线程
yield方法
  让出CPU。给其它线程运行的机会
join范例:

public class TestJoin extends Thread{	public static void main(String[] args) {		MyThread t1 = new MyThread("t1");		t1.start();		try {t1.join();}		catch (InterruptedException e) {}		for(int i=1;i<=10;i++) {			System.out.println("i am main thread");		}	}}class MyThread extends Thread {	MyThread(String s) {super(s);}	public void run() {		for(int i=1;i<=10;i++) {			System.out.println("i am "+getName());			try {sleep(1000);}			catch (InterruptedException e) {return;}		}	}}
yield范例:
public class TestYield {	public static void main(String[] args) {		MyThread t1 = new MyThread("t1");		MyThread t2 = new MyThread("t2");		t1.start(); t2.start();	}}class MyThread extends Thread {	MyThread(String s) {super(s);}	public void run() {		for(int i=1;i<=100;i++) {			System.out.println(getName()+": "+i);			if(i%10==0) {				yield();			}		}	}}
【线程的优先级别】
Java提供一个线程调度器来监控程序中启动后进入就绪状态的全部线程。

线程调度器依照线程的优先级决定应调度那个线程来运行。

线程的优先级用数字表示,范围从1到10,一个线程的缺省优先级是5.
  Thread.MIN_PRIORITY = 1
  Thread.MAX_PRIORITY = 10
  Thread.NORM_PRIORITY = 5
使用下述方法获得或设置线程对象的优先级。
  int getPriority();
  void setPriority(int new Priority);
Priority范例:

public class TestPriority {	public static void main(String[] args) {		Thread t1 = new Thread(new T1());		Thread t2 = new Thread(new T2());		t1.setPriority(Thread.NORM_PRIORITY + 3);		t1.start();		t2.start();	}}class T1 implements Runnable {	public void run() {		for(int i=0;i<100;i++) {			System.out.println("T1: "+i);		}	}}class T2 implements Runnable {	public void run() {		for(int i=0;i<100;i++) {			System.out.println("------T2: "+i);		}	}}
【线程同步】
在Java语言中,引入了对象相互排斥锁的概念,保证共享数据操作的完整性。

每一个对象都相应于一个可称为"相互排斥锁"的标记,这个标记保证在随意时刻,仅仅能有一个线程訪问该对象。

keywordsynchronized来与对象相互排斥锁联系。当某个对象synchronized修饰时,表明该对象在随意时刻仅仅能由一个线程訪问。

synchronized 的用法:
synchronized(this) {...}
synchronized还能够放在方法声明中。表示整个方法为同步方法,比如:
  synchronized public void add(String name) {...}
范例:

public class TestSync implements Runnable {	Timer timer = new Timer();	public static void main(String[] args) {		TestSync test = new TestSync();		Thread t1 = new Thread(test);		Thread t2 = new Thread(test);		t1.setName("t1");		t2.setName("t2");		t1.start();		t2.start();	}	public void run() {		timer.add(Thread.currentThread().getName());	}}class Timer {	private static int num = 0;	public synchronized void add(String name) {		//synchronized (this) {			num ++;			try {Thread.sleep(1);}			catch (InterruptedException e) {}			System.out.println(name+", 你是第"+num+"个使用timer的线程");		//}	}}
【死锁】
范例:
public class TestDeadLock implements Runnable {	public int flag = 1;	static Object o1 = new Object(), o2 = new Object();	public void run() {		System.out.println("flag=" + flag);		if(flag == 1) {			synchronized(o1) {				try {Thread.sleep(500);}				catch (Exception e) {					e.printStackTrace();				}				synchronized(o2) {					System.out.println("1");				}			}		}		if(flag == 0) {			synchronized(o2) {				try {Thread.sleep(500);}				catch (Exception e) {					e.printStackTrace();				}				synchronized(o1) {					System.out.println("0");				}			}		}	}	public static void main(String[] args) {		TestDeadLock td1 = new TestDeadLock();		TestDeadLock td2 = new TestDeadLock();		td1.flag = 1;		td2.flag = 0;		Thread t1 = new Thread(td1);		Thread t2 = new Thread(td2);		t1.start();		t2.start();	}}

转载地址:http://oqmbx.baihongyu.com/

你可能感兴趣的文章
“Info.plist” couldn’t be removed
查看>>
多线程day01
查看>>
react-native 模仿原生 实现下拉刷新/上拉加载更多(RefreshListView)
查看>>
MySQL出现Access denied for user ‘root’@’localhost’ (using password:YES)
查看>>
通过Roslyn构建自己的C#脚本(更新版)(转)
查看>>
红黑树
查看>>
UIImagePickerController拍照与摄像
查看>>
python调用windows api
查看>>
Linux内核中的printf实现【转】
查看>>
第四章 mybatis批量insert
查看>>
Java并发框架——什么是AQS框架
查看>>
【数据库】
查看>>
Win配置Apache+mod_wsgi+django环境+域名
查看>>
第四届中国汽车产业信息化技术创新峰会将于6月在沪召开
查看>>
linux清除文件内容
查看>>
WindowManager.LayoutParams 详解
查看>>
find的命令的使用和文件名的后缀
查看>>
Android的Aidl安装方法
查看>>
Linux中rc的含义
查看>>
曾鸣:区块链的春天还没有到来| 阿里内部干货
查看>>