Thread



package com.edu_03;
/**
 * 实现Runable接口:
 *
 */
public class MyThread implements Runnable{
 @Override
 public void run() {
  //启动该线程对象之后,需要执行的代码
  for (int i = 0; i < 10; i++) {
   System.out.println(i);
  } 
 }

}

package com.edu_03;

public class Test {
 public static void main(String[] args) {
  //创建Mythread对象
  MyThread mt = new MyThread();
  //开启这个线程
  //mt.start();//这里的这个类仅仅是实现了Runnalble接口的一个类,但是start方法在Thread类中
  //但是我们想要开启一个线程,就必须调用start方法,请问怎么办?
  
  //public Thread(Runnable target)
  Thread t1 = new Thread(mt);
  t1.start();
  
  
 }

}

package com.edu_04;   
 (3)多线程的几个问题:
  A:启动线程用的是哪个方法
   start()
  B:start()和run()的区别
   start():1.开启线程  2.执行run()方法里面的代码
   run():执行的是线程里面执行的代码,并不会开启线程
  C:为什么要重写run()
   因为每个线程需要执行的代码都是都是不一样的,
   我们需要将每个线程自己独立执行的代码写到run()方法中执行
  D:线程可以多次启动吗

public class Test {
 public static void main(String[] args) {
  //B:start()和run()的区别
  // 创建一个线程独享
  MyThread mt = new MyThread();
  MyThread mt2 = new MyThread();
  //mt.start();//1.首先开启了一个独立的线程 2.让这个独立的线程执行run方法中的代码
  
  System.out.println("--------");
  //mt.run();//1.普通的创对象,调方法  2.代码实在主线程执行,不会开辟新线程
  
  
  //D:线程可以多次启动吗
  mt.start();
  //mt2.start();//如果是不同的线程对象,是可以同时开启的
  //mt.start();//线程是不能多次启动的
  
 }

}

package com.edu_05;
  (4)线程的调度和控制
  线程休眠(Thread.sleep(毫秒值))
  线程名称(setName(),getName();)
  线程的调度及优先级setPriority(10)(注意默认值是5,区间在1-10之间)
  什么叫线程优先级:说白了就是设置你抢占cpu执行权抢占到的概率
public class Test {
 public static void main(String[] args) {
  //线程名称(setName(),getName();)
  //创建3个线程对象
  MyThread t1 = new MyThread();
  MyThread t2 = new MyThread();
  MyThread t3 = new MyThread();
  
  //给三个线程设置姓名
  t1.setName("刘备");
  t2.setName("张飞");
  t3.setName("关羽");
  
  //设置线程的优先级
  //线程的调度及优先级setPriority(10)(注意默认值是5,区间在1-10之间)
  //t1.setPriority(100);//设置的区间必须在1-10之间
  t1.setPriority(10);
  
  //开启线程
  t1.start();
  t2.start();
  t3.start();
 }

}
package com.edu_06;

public class Test {
 public static void main(String[] args) {
  //创建三个线程并且启动三个线程
  MyThread mt = new MyThread();
  
  //创建县城对象
  Thread t1 = new Thread(mt);
  Thread t2 = new Thread(mt);
  Thread t3 = new Thread(mt);
  
  //给县城设置姓名
  t1.setName("刘备");
  t2.setName("关羽");
  t3.setName("张飞");
  
  //启动线程
  t1.start();
  t2.start();
  t3.start();
  
 }

}
package com.edu_07;
//5.1继承Thread卖票
public class Test {
 public static void main(String[] args) {
  //创建三个线程模拟三个售票窗口
  MyThread mt1 = new MyThread();
  MyThread mt2 = new MyThread();
  MyThread mt3 = new MyThread();
  
  //给线程设置名称
  mt1.setName("窗口一");
  mt2.setName("窗口二");
  mt3.setName("窗口三");
  
  //启动线程,开启售票
  mt1.start();
  mt2.start();
  mt3.start();
  
 }

}
package com.edu_10;
/**
 *   C:锁对象问题
   a:同步代码块(定义一个抽象类,里面专门定义一个锁)
    任意对象
   
   b:同步方法(仅适用于实现runable接口)
   public synchronized void sellTicket(){同步代码}
    this
   
   c:静态同步方法
    类的字节码对象
    public static synchronized void sellTicket() {
      需要同步的代码
    }
 *
 */
public class MyThread implements Runnable{
 //定义100张票
 static int ticket = 100;
 Object obj = new Object();
 int x = 0;
 
 @Override
 public void run() {
  while (true) {
   if (x%2==0) {
    synchronized (MyThread.class) {//这样3个线程才可以共享同一把锁 
     if (ticket>0) {
       //考虑到实际的生活中,我们需要给每一个线程加入一定的延迟,模拟一下这种效果
       try {
        Thread.sleep(100);
       } catch (InterruptedException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
       }
       
       System.out.println(Thread.currentThread().getName()+"正在出售第:"+ticket--+"张票");
      }
     }
   }else {
    sellTicket(); 
   }
   x++;
  }
  
 }

 private void sellTicket() {
  synchronized (obj) {//这样3个线程才可以共享同一把锁 
   if (ticket>0) {
     //考虑到实际的生活中,我们需要给每一个线程加入一定的延迟,模拟一下这种效果
     try {
      Thread.sleep(100);
     } catch (InterruptedException e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
}     
     System.out.println(Thread.currentThread().getName()+"正在出售第:"+ticket--+"张票");
    }
   }
 }
 
 
 //同步方法:同步方法是将synchronized关键字加到方法上,同步方法的锁是this
 private synchronized void sellTicket() { 
  if (ticket>0) {

//考虑到实际的生活中,我们需要给每一个线程加入一定的延迟,模拟一下这种效果
    try {
     Thread.sleep(100);
    } catch (InterruptedException e) {
     // TODO Auto-generated catch block
     e.printStackTrace();
    }
    
   System.out.println(Thread.currentThread().getName()+"正在出售第:"+ticket--+"张票");
   
  }
 }
 
 
 //静态同步方法,他的锁是本类的字节码文件对象:类名.class。
 private static synchronized void sellTicket() { 
 if (ticket>0) {
   //考虑到实际的生活中,我们需要给每一个线程加入一定的延迟,模拟一下这种效果
   try {
    Thread.sleep(100);
   } catch (InterruptedException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
   }
   
   System.out.println(Thread.currentThread().getName()+"正在出售第:"+ticket--+"张票");
  
 }
}

}













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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值