java多线程基础知识(主要涉及到Thread类和Runable接口)

一.创建多线程的第一种方式,创建Thread类的子类

实例1

1.在子类中重写Thread中的run方法
2.创建子类的对象
3.调用start()方法开启线程,java虚拟机调用run方法
4.run方法和main方法并发执行
5.java属于抢占调度

class MyThread extends Thread{
  public void run() {
  	for(int i = 0;i<5;i++) {
  		System.out.println("run"+i);
  	}
  }
}        
public class Demo01Thraed {
  public static void main(String[] args) {
  	MyThread mt = new MyThread();
  	mt.start();
  	
  	//主线程会继续执行主方法中的代码
  	for(int i = 0;i<5;i++) {
  		System.out.println("main"+i);
  	}
  }
}
运行结果

在这里插入图片描述

实例二

通过调用Thread类中的两个方法获取线程的对象和名字(currentThread()和getName()方法)

class MMyThread extends Thread{
	public void run() {
		System.out.println(Thread.currentThread().getName());//获取线程的对象和名字
	}                   //currentThread()返回当前正在执行的线程的对象的引用
	                    //getName()获取线程的名称,默认情况下从0开始
} 
public class Demo02Thraed {
	public static void main(String[] args) {
		MMyThread mt =new MMyThread();
		mt.start();
		MMyThread mt1 =new MMyThread();
		mt1.start();
		new MMyThread().start();//三个线程
	}
}

运行结果

在这里插入图片描述

实例三

通过构造方法自己设置名字

class Tgg extends Thread{
  public Tgg(){
  	
  }
  public Tgg(String name) {
  	super(name);
  }
  public void run() {
  	System.out.println(Thread.currentThread().getName()+"执行了");
  }
}
public class Demo03Thread {
  public static void main(String[] args) {
  	new Tgg("小刘").start();
  	new Tgg("小卫").start();
  	new Tgg("小刚").start();
  }
}
运行结果

在这里插入图片描述

实例四

main()方法和自己的线程争cpu

/*1.主线程main
 *2.新建的线程
 *3.抢占cpu
*/
class ee extends Thread{
	public void run() {
		System.out.println(Thread.currentThread().getName()+"执行了");
	}
}
public class Examople04 {
	public static void main(String[] args) {
		new ee().start();
		new ee().start();
		
		System.out.println(Thread.currentThread().getName()+"执行了");
		
	}
}
运行结果

在这里插入图片描述

实例五

1.Thread类中sleep方法的使用
2.这个方法有异常,要处理
3.这个方法的主要作用就是让程序休眠一定的时间在继续下面的过程

/*
 *1.此程序仅仅关于Thread类中的sleep()方法
 *   public static void sleep(long mills)使当前在运行的程序暂停多少毫秒 */
public class Example05 {
	public static void main(String[] args) {
		System.out.println("每两秒打印一个数");
		for(int i=0;i<5;i++) {
			System.out.println(i);
			try {
				Thread.sleep(2000);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
		System.out.println("结束");
	}
}
运行结果

在这里插入图片描述

二.创建线程的第二种方式,创建一个Runnable接口的实现类

实例1
  • 1.创建一个Runnable接口的实现类
  • 2.在实现类中重写Run设置线程任务
  • 3.创建一个Runnable接口的实现类对象
  • 4.创建==Thread类对象,构造方法传递Runnable接口的实现类对象
  • 5.调用Thread类中的Start方法,开启新的线程执行Run方法
class yy implements Runnable{
   public void run() {//自己建的
   	for(int i =0;i<5;i++)
   		System.out.println(Thread.currentThread().getName()+"执行了");
   }
}
public class Example06 {
   public static void main(String[] args) {
   	yy y = new yy();
   	Thread wu = new Thread(y);
   	Thread er = new Thread(y);
   	wu.start();
   	er.start();//创建了两个
   	//主线程的
   	for(int i = 0;i<5;i++) {
   		System.out.println(Thread.currentThread().getName()+"执行了");
   	}
   }
}

运行结果

多运行几次,结果都是不一样的
结果1
在这里插入图片描述
结果2
在这里插入图片描述

实例二

买票问题

/*
 * 线程的应用
 * 设置线程任务:卖票
 *   
 * */
class uio implements Runnable{
	
	//定义多个线程共享的票源
	private int ticket = 50;
	
	//设置线程任务:卖票
	public void run() {
		//让其
		while(true) {
			//先判断票是否存在
			if(ticket>0) {
				
				//提高安全问题出现的概率
				try {
					//票存在就卖票
					Thread.sleep(1000);
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
				
				
				System.out.println(Thread.currentThread().
						getName()+"卖出了第"+ticket+"票");
				ticket--;
			}
		}
	}
}
public class Example07 {
	public static void main(String[] args) {
		uio pp = new uio();
		//创建Thread类对象,构造方法中传递Runnable接口中的实现类对象 
		Thread t1 = new Thread(pp);
		Thread t2 = new Thread(pp);
		Thread t3 = new Thread(pp);
		//调用start方法开启三个线程
		t1.start();
		t2.start();
	    t3.start();
	}
}

运行结果和结果分析在下节
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

莪假裝堅強

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值