线程 Thread Runnable Join

1.main是主线程,使用继承Thread的方法,无法多线程之间共享实例属性,因为每new一个Thread有自己的属性i,所以不共享。

class FirstThread extends Thread
{
	private int i;
	//重写run方法
	public void run(){
		for(i=0; i<100; i++){
			System.out.println(getName() + " " +i);  //getName返回该线程的名字
		}
	}


	public static void main(String[] args) 
	{
		for(int i=0; i<100; i++){
			System.out.println(Thread.currentThread().getName() + " " + i); //当前线程名字
			if(i==20){
				new FirstThread().start();  //创建启动第一条线程
				new FirstThread().start();  //创建启动第二条线程
			}
		}
		
	}
}

输出:

---------- 运行Java程序 ----------
main 0
main 1
main 2
main 3
main 4
main 5
main 6
main 7
main 8
main 9
main 10
main 11
main 12
main 13
main 14
main 15
main 16
main 17
main 18
main 19
main 20
Thread-0 0
Thread-0 1
main 21
Thread-0 2
main 22
Thread-0 3
Thread-0 4
Thread-1 0
Thread-1 1
Thread-1 2
Thread-1 3
........省略


2.继承Runnable接口的方法实现线程,由于创建线程时时同一个target的st,所以线程之间共享i,是连续的

class SecondThread implements Runnable
{
	private int i;
	public void run(){
		for(; i<100; i++){
			System.out.println(Thread.currentThread().getName() + " " + i);
		}
	}
	public static void main(String[] args) 
	{
		for(int i=0; i<100; i++){
			System.out.println(Thread.currentThread().getName() + " " + i);
			if(i==20){
				SecondThread st = new SecondThread();
				//(Runnable target, String name) SeconThread是同一个target,共享i
				new Thread(st, "新线程1").start();  
				new Thread(st, "新线程2").start();
			}
		}

	}
}




线程的生命周期

新建New

 就绪Runnable    start()以后处于就绪状态

运行running         执行run()方法时

阻塞Blocked         调用sleep等方法

 死亡Dead            run()方法执行完,异常,stop()等



控制线程 Join

main线程中调另一个线程jt.join(),main要等jt执行完毕才能执行


class JoinThread extends Thread 
{
	public JoinThread(String name){
		super(name);
	}
	public void run(){
		for(int i=0; i<100; i++){
			System.out.println(getName() + " " + i);
		}
	}
	public static void main(String[] args) throws Exception
	{
		new JoinThread("新线程").start();
		for(int i=0; i<100; i++){
			if(i==20){
				JoinThread jt = new JoinThread("被Join线程");
				jt.start();
				//main线程调用jt的join方法,所以main线程要等jt执行完毕后才能执行
				jt.join(); 
			}
			System.out.println(Thread.currentThread().getName() + " " + i);
		}
	}
}



后台线程

所有前台线程死亡后,后台线程就自动死亡,JVM的垃圾回收线程就是典型的后台线程

setDaemon必须在start之前设置

		Thread t = new Thread();
		t.setDaemon(true);
		t.start();


线程睡眠

暂停一段时间

public void run(){
for(int i=0; i<100; i++){
	System.out.println(getName() + " " + i);
	Thead.sleep(1000); //暂停1秒
	}
}


线程的让步 

Thread.yield()优先级高的线程优先执行,高级执行完再执行低级,低级暂定

线程优先级设置

setPriority()

class ThreadYield extends Thread
{
	private int i;
	ThreadYield(String name){
		super(name);
	}


	public void run(){
		for(; i<100; i++){
			System.out.println(getName() + " " + i);
			if(i==0){
				Thread.yield();
			}
		}
	}


	public static void main(String[] args) 
	{
				ThreadYield ty1 = new ThreadYield("高级");
				//ty1.setPriority(Thread.MAX_PRIORITY);
				ty1.start();
				ThreadYield ty2 = new ThreadYield("低级");
				//ty2.setPriority(Thread.MIN_PRIORITY);
				ty2.start();
	}
}


线程的同步

不同时,num的值小于0了,还能继续计算,导致出错

class ThreadSafe implements Runnable
{
	int num = 10;
	public void run(){
		for(int i=0; i<20; i++){
			if(num>0){
				try{
					Thread.sleep(1000);
				}catch(Exception e){
					e.printStackTrace();
				}
				System.out.println("tickets:" + num--);
			}
		}	
		
	}

	public static void main(String[] args) 
	{
		ThreadSafe t = new ThreadSafe();
		Thread A = new Thread(t);
		Thread B = new Thread(t);
		Thread C = new Thread(t);
		Thread D = new Thread(t);
		A.start();
		B.start();
		C.start();
		D.start();
	}
}

---------- 运行Java程序 ----------
tickets:10
tickets:10
tickets:8
tickets:9
tickets:7
tickets:5
tickets:6
tickets:7
tickets:4
tickets:3
tickets:4
tickets:2
tickets:1
tickets:0
tickets:1
tickets:-1


输出完成 (耗时 4 秒) - 正常终止


同步代码块

synchronized(Object){ }   Object为任意代码块,标识位为0正在其他线程运行,1处于就绪状态

class ThreadSafe implements Runnable
{
	int num = 10;
	public void run(){
		synchronized(""){
			for(int i=0; i<20; i++){
				if(num>0){
					try{
						Thread.sleep(1000);
					}catch(Exception e){
						e.printStackTrace();
					}
					System.out.println("tickets:" + num--);
				}
			}	
		}
	}

	public static void main(String[] args) 
	{
		ThreadSafe t = new ThreadSafe();
		Thread A = new Thread(t);
		Thread B = new Thread(t);
		Thread C = new Thread(t);
		Thread D = new Thread(t);
		A.start();
		B.start();
		C.start();
		D.start();
	}
}

---------- 运行Java程序 ----------
tickets:10
tickets:9
tickets:8
tickets:7
tickets:6
tickets:5
tickets:4
tickets:3
tickets:2
tickets:1


输出完成 (耗时 10 秒) - 正常终止


同步方法

run方法不能设置为同步方法

class ThreadSafe implements Runnable
{
	int num = 10;
	public void run(){
		doit();
	}

	public synchronized void doit(){
		for(int i=0; i<20; i++){
			if(num>0){
				try{
					Thread.sleep(1000);
				}catch(Exception e){
					e.printStackTrace();
				}
				System.out.println("tickets:" + num--);
			}
		}	
	}

	public static void main(String[] args) 
	{
		ThreadSafe t = new ThreadSafe();
		Thread A = new Thread(t);
		Thread B = new Thread(t);
		Thread C = new Thread(t);
		Thread D = new Thread(t);
		A.start();
		B.start();
		C.start();
		D.start();
	}
}

---------- 运行Java程序 ----------
tickets:10
tickets:9
tickets:8
tickets:7
tickets:6
tickets:5
tickets:4
tickets:3
tickets:2
tickets:1


输出完成 (耗时 10 秒) - 正常终止


同步锁 Lock

ReentrantLock类,lock()和unlock()方法

import java.util.concurrent.locks.ReentrantLock;
class ThreadSafe implements Runnable
{
	private final ReentrantLock lock = new ReentrantLock();
	int num = 10;
	public void run(){
		lock.lock();
		try{
			for(int i=0; i<20; i++){
				if(num>0){
					try{
						Thread.sleep(1000);
					}catch(Exception e){
						e.printStackTrace();
					}
					System.out.println("tickets:" + num--);
				}
			}
		}finally{
			lock.unlock();
		}
	}

	public static void main(String[] args) 
	{
		ThreadSafe t = new ThreadSafe();
		Thread A = new Thread(t);
		Thread B = new Thread(t);
		Thread C = new Thread(t);
		Thread D = new Thread(t);
		A.start();
		B.start();
		C.start();
		D.start();
	}
}

---------- 运行Java程序 ----------
tickets:10
tickets:9
tickets:8
tickets:7
tickets:6
tickets:5
tickets:4
tickets:3
tickets:2
tickets:1


输出完成 (耗时 10 秒) - 正常终止




  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值