java多线程的基础和操作

                                                            实训之--java多线程

多线程之基础

先来两种实现方式。Thread类 和implement  Runnable

1.Thread

    //多线程·启动的唯一方法: Thread类中的start()

    //线程的主类:继承Thread的类。我认为,多线程的主类在主方法中运行时,和主方法中函数是同级的。

    //Thread类有run(),start().

public class TeseThreadDemo1 {

	public TeseThreadDemo1() {
		// TODO Auto-generated constructor stub
	}
	public static void main(String[] args) {
   // 主线程三?这个for和它们是啥关系?
		for(int i=0;i<200;i++) {
			System.out.println("这是我主线程要执行的方法");
		}
		MyThread m1=new MyThread("线程a");//主线程一
		MyThread m2=new MyThread("线程b");//主线程二
		m1.start();
		m2.start();
	}
}
//多线程·启动的唯一方法: Thread类中的start()
//线程的主类,Thread类有run(),start().
class MyThread extends  Thread{
	private String name;
	MyThread(String name) {
		this.name=name;
	}
	@Override
	public void run() {
		for(int i=100;i>0;i--) {
		System.out.println(this.name+"->"+i);
	}
}
}

优缺点:自然是单继承的局限性。实现比下面较为简单。

2. interface Runnable

    //思想:

//runnable接口中有也run(),,实现了接口的主类当然复写run()
//start()只有Threadl类中有,就要考虑,主类去继承Thread类
//碰巧,Thread有个构造方法,Thread(Runnable  target)

//那么虽然不是继承,但是作为Thread类中参数的,仍然能调用类中的start()。完美!

package thread;

import java.util.jar.Attributes.Name;

public class TestRunnableDemo1 {

	public TestRunnableDemo1() {
		// TODO Auto-generated constructor stub
	}
	public static void main(String[] args) {
		MyThread2 m1=new MyThread2("线程a");
		MyThread2 m2=new MyThread2("线程b");
		new Thread(m1).start();
		new Thread(m2).start();
	}
}
//线程的主类
class  MyThread2 implements  Runnable{
	private String name;
	public MyThread2(String name) {
		this.name=name;
	}
	
	@Override
	 public void run() {
		 for(int x=0;x<200;x++) {
			 System.out.println(this.name+x);
		 }
	 }
}

优缺点:推介的方法。克服单继承。比较复杂。

3。两种方法的比较。

    除了他们的优缺点之外,就是:接口更能体现“数据共享”的概念。

为何?在接口中,我们实例化了一个MyThread的对象,但是被多个Thread类作为参数使用,这就能能够共享这一个对象。也就是说,5张票被3个窗口合伙卖完。

当然,Thread也是能实现这样的功能,只是比较不符合常理。new Thread(thrtead).start()。这个意思就好比说俩人都口渴,我的水不喝了,把你的给我何吧。哈哈!

4、同步synchrnized

        同步的两种方式:同步代码块,同步方法  。同步特别消耗资源,故推介用代码块,消耗少

        说白了就是,一个是把 代码块用方法 包 起来了,一个是把 代码块 用 方法包起来了。多个线程,相互知道对方

为啥用同步?

        解决在多线程中,多个线程调用同一个系统资源/类变量,造成的数据不准确问题。说白了比如,a买票,b也买,窗口a看的时候还有一张,突然,控制权被窗口b抢去了,还有一张,卖给b,这时,窗口a把控制权抢回来,刚才还有一张,直接卖了a.冲突。

public class synvhtonixrfxrfzdemo {

	public synvhtonixrfxrfzdemo() {
		// TODO Auto-generated constructor stub
	}
	public static void main(String[] args) {
		MyThread4 m1=new MyThread4();
		new Thread(m1,"线程a").start();
		new Thread(m1,"线程b").start();
	}
	
}
class MyThread4  implements Runnable{
	private  int ticket=5;
	@Override
	public void run() {
		for(int i=0;i<20;i++) {
			synchronized (this) {//指该类的类对象
			if(this.ticket>0){
				System.out.println(Thread.currentThread().getName()+"在卖票"+this.ticket--);
			}			
		}
	}
	}
}

5.死锁

    俩线程都占用对方需要的资源,且缺少对方拥有的资源,互不让步,无限等待。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值