1101java多线程

多线程的引入

同时对多项任务加以控制

package com.java1234.chap08.yun1;

public class Demo1 {
	
	private static void music() {
		 for (int i = 0; i < 100; i++) {
			System.out.println("听音乐");
		}
	}

	private static void eat() {
		for (int i = 0; i < 100; i++) {
			System.out.println("吃饭");
		}
	}
	
	
	public static void main(String[] args) {
		/*music();
		eat();*/
		//利用多线程实现一边吃饭一边听歌
		Music musicThread=new Music();
		Eat eatThread=new Eat();
		musicThread.start();
		eatThread.start();
	}

}

Java多线程实现

继承 Thread 类
package com.java1234.chap08.yun2;

public class Thread1 extends Thread{
	
	private int baoZi=1;
	
	private String threadname;

	public Thread1(String threadname) {
		super();
		this.threadname = threadname;
	}

	@Override
	public void run() {
		while (baoZi<=10) {
			System.out.println(threadname+"吃第"+baoZi+"个包子");
			baoZi++;
			}	
	}
	
	public static void main(String[] args) {
		System.out.println("雨杰和学云一起吃包子");
		Thread t1=new Thread1("雨杰");
		Thread t2=new Thread1("学云");
		t1.start();
		t2.start();
	}
	

}
实现Runnable 接口
package com.java1234.chap08.yun2;

import com.java1234.chap08.yun2.Thread2;

public class Thread2 implements Runnable{

	private int baoZi=1;
	
	private String threadName;

	public Thread2(String threadName) {
		super();
		this.threadName = threadName;
	}

	@Override
	public synchronized void run() {//线程同步
		while(baoZi<=10){
			System.out.println(threadName+" 吃第"+baoZi+"包子");
			baoZi++;
		}
	}
	
	public static void main(String[] args) {
		/*System.out.println("一起吃包子,每人吃了10个");
		Thread2 t1=new Thread2("雨杰线程");
		Thread2 t2=new Thread2("学云线程");
		Thread t11=new Thread(t1);
		Thread t12=new Thread(t2);
		t11.start();
		t12.start();*/
		
		//实现三个线程吃包子
		Thread2 t1=new Thread2("超级王雨杰");
		Thread t11=new Thread(t1);
		Thread t12=new Thread(t1);
		Thread t13=new Thread(t1);
		t11.start();
		t12.start();
		t13.start();
	}
}

线程状态

线程状态图

  1. 创建状态
    在程序中用构造方法创建了一个线程对象后,新的线程对象便处于新建状态,此时,它已经有了相应的 内存空间和其他资源,但还处于不可运行状态。新建一个线程对象可采用 Thread 类的构造方法来实现,例如,“Thread thread=new Thread();”。
  2. 就绪状态
    新建线程对象后,调用该线程的 start()方法就可以启动线程。当线程启动时,线程进入就绪状态。此时, 线程将进入线程队列排队,等待 CPU 服务,这表明它已经具备了运行条件。
  3. 运行状态
    当就绪状态的线程被调用并获得处理器资源时,线程就进入了运行状态。此时,自动调用该线程对象的 run()方法。run()方法定义了该线程的操作和功能。
  4. 堵塞状态
    一个正在执行的线程在某些特殊情况下,如被人为挂起或需要执行耗时的输入/输出操作时,将让出 CPU 并暂时中止自己的执行,进入堵塞状态。堵塞时,线程不能进入排队队列,只有当引起堵塞的原因被消除后,线程才可以转入就绪状态。
  5. 死亡状态
    线程调用 stop()方法时或 run()方法执行结束后,即处于死亡状态。处于死亡状态的线程不具有继续运行的能力。

线程常用方法

currentThread()
  1. getName(); 返回该线程的名称
  2. currentThread();返回对当前正在执行的线程对象的引用
package com.java1234.chap08.yun4;

public class Demo1 implements Runnable{

	@Override
	public void run() {
		// TODO Auto-generated method stub
		for (int i = 0; i < 10; i++) {
			//获取当前线程
			Thread t=Thread.currentThread();
			System.out.println(t.getName()+":"+i);	//返回线程的名称
		}
	}
	public static void main(String[] args) {
		Demo1 demo1=new Demo1();
		new Thread(demo1).start();
		new Thread(demo1).start();
		new Thread(demo1,"线程三").start();
	}

}

isAlive();

测试线程是否处于活动状态

package com.java1234.chap08.yun4;

public class Demo2 implements Runnable{
	@Override
	public void run() {
		// TODO Auto-generated method stub
		for (int i = 0; i < 10; i++) {
			//获取当前线程
			Thread t=Thread.currentThread();
			System.out.println(t.getName()+":"+i);	//返回线程的名称
		}
	}
	public static void main(String[] args) {
		Demo2 demo2=new Demo2();
		Thread t1=new Thread(demo2);
		System.out.println("t1是否活动"+t1.isAlive());	//创建状态为false
		t1.start();
		System.out.println("t1是否活动"+t1.isAlive());	//true
	}

}
sleep();线程休眠
package com.java1234.chap08.yun4;

public class Demo3 implements Runnable{

	@Override
	public void run() {
		// TODO Auto-generated method stub
		for(int i=0;i<10;i++){
			try {
				Thread.sleep(1000);	//一秒执行一次
				// 获取当前线程
				Thread t=Thread.currentThread();
				System.out.println(t.getName()+":"+i); // 返回线程的名称
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
	}
	
	public static void main(String[] args) {
		Demo3 demo1=new Demo3();
		new Thread(demo1).start();
		
	}

}
setPriority(int newPriority);

更改线程的优先级

package com.java1234.chap08.yun4;

public class Demo4 implements Runnable{

	@Override
	public void run() {
		// TODO Auto-generated method stub
		for(int i=0;i<10;i++){
			Thread t=Thread.currentThread();
			System.out.println(t.getName()+":"+i); // 返回线程的名称	
		}
	}
	
	public static void main(String[] args) {
		Demo4 demo4=new Demo4();
		Thread t1=new Thread(demo4,"线程A");
		Thread t2=new Thread(demo4,"线程B");
		Thread t3=new Thread(demo4,"线程C");
		t1.setPriority(Thread.MAX_PRIORITY);      //最高
		t2.setPriority(Thread.MIN_PRIORITY);      //最低
		t3.setPriority(Thread.NORM_PRIORITY);     //默认
		t1.start();
		t2.start();
		t3.start();
	}

}

yield();

暂停当前正在执行的线程对象,并执行其他线程
线程常用的方法还有很多,慢慢练吧

package com.java1234.chap08.yun4;

public class Demo5 implements Runnable{

	@SuppressWarnings("static-access")
	@Override
	public void run() {
		// TODO Auto-generated method stub
		for(int i=0;i<10;i++){
			try {
				Thread.sleep(100);
				// 获取当前线程
				Thread t=Thread.currentThread();
				System.out.println(t.getName()+":"+i); // 返回线程的名称
				
				if(i==5){
					System.out.println("线程礼让:");
					Thread.currentThread().yield();
				}
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
	}
	
	public static void main(String[] args) {
		Demo5 demo1=new Demo5();
		new Thread(demo1,"线程A").start();
		new Thread(demo1,"线程B").start();
	}

}

线程同步

同步方法
  • 即有synchronized关键字修饰的方法。 由于java的每个对象都有一个内置锁,当用此关键字修饰方法时, 内置锁会保护整个方法。在调用该方法前,需要获得内置锁,否则就处于阻塞状态。
  • synchronized关键字也可以修饰静态方法,此时如果调用该静态方法,将会锁住整个类
package com.java1234.chap08.yun5;

public class Demo2 implements Runnable{

	private int baozi=10;
	
	@Override
	public  synchronized void run() {	//同步关键字synchronized
		// TODO Auto-generated method stub
		while (baozi>0) {
			System.out.println(Thread.currentThread().getName()+"吃了第"+baozi+"个包子");
			baozi--;
		}
	}
	public static void main(String[] args) {
		Demo2 demo1=new Demo2();
		new Thread(demo1,"雨杰").start();
		new Thread(demo1,"宝宝").start();
		new Thread(demo1,"学云").start();
	}
	
}

同步块
  • 即有synchronized关键字修饰的语句块。 被该关键字修饰的语句块会自动被加上内置锁
  • 同步是一种高开销的操作,因此应该尽量减少同步的内容。通常没有必要同步整个方法,使用synchronized代码块同步关键代码即可
package com.java1234.chap08.yun5;

public class Demo3 implements Runnable{

	private int baozi=10;
	
	@Override
	public void run() {	
		synchronized (this) {	//同步块
			while (baozi>0) {
			System.out.println(Thread.currentThread().getName()+"吃了第"+baozi+"个包子");
			baozi--;
		}
		// TODO Auto-generated method stub
		
		}
	}
	public static void main(String[] args) {
		Demo3 demo1=new Demo3();
		new Thread(demo1,"雨杰").start();
		new Thread(demo1,"宝宝").start();
		new Thread(demo1,"学云").start();
	}
	
}

其他

  • 挺基础的,也很重要,就是学的太晚了,
  • 记得有次HR还问到了,啥都没答上来
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值