黑马程序员java学习笔记,多线程

多线程
线程时进程中一个独立的控制单元,线程在控制着进程的执行。
一个进程至少有一个线程
JVM启动的时候会有一个进程java.exe
该进程中至少一个线程负责java程序的执行
而且这个线程运行的代码存在于main方法中,为主线程

class ThreadDemo extends Thread {
 public void run(){
  
 }
}
继承一个Thread类:1.定义类继承Thread类2.复写run方法3.调用start()方法
ThreadDemo d=new ThreadDemo();
d.start();//开启线程并执行该线程的run方法
每次运行结果都不是一样的,因为多个线程都获取cpu的执行权,互相抢夺cpu资源。
Thread类用于描述线程,该类定义了一个功能,用于存储线程要运行的代码,该代码就是run方法

wait(),notify(),sleep(time),stop()
Thread.currentThread().getName();当前线程

/*
卖票程序,多个窗口都能卖票
**/
class TicketSell extends Thread{
 private static int tick=100;//使用静态
 public void run(){
  while(true){
  if(tick>0){
   System.out.println(Thread.currentThread().getName()+"sale"+tick--);
  }
  }
 }
}
class TicketDemo{
 public static void main(String[] args){
  TicketSell t1=new TicketSell();
  TicketSell t2=new TicketSell();
  TicketSell t3=new TicketSell();
  TicketSell t4=new TicketSell();
  t1.start();
  t2.start();
  t3.start();
  t4.start();
 }
}

---------------------------------------------------------
1.定义实现Runnable接口
2.覆盖run方法
3.通过Thread类建立线程对象
4.将Runnable接口的子类作为对象传给Thread类的构造函数
5.调用Thread类的start方法开启线程并调用Runnable接口

class TicketSell implements Runnable{//extends Thread{
 private static int tick=100;//使用静态
 Object obj=new Object();
 public void run(){
  while(true)
  {
   Synchronized(obj){
  if(tick>0){
   System.out.println(Thread.currentThread().getName()+"sale"+tick--);
  }
  }
  }
 }
}
class TicketDemo{
 public void main(String[] args){
  TicketSell s=new TicketSell();
  Thread t=new Thread(s);
  t.start();
 }
}
多线程的安全问题
   当多条语句在操作同一个线程共享数据时,一个线程对多条语句只执行了一部分,另一个线程参与进来执行
导致共享数据的错误。
   同步代码块
    synchronized(对象){
  需要被同步的代码;
 }
同步函数,sychronized修饰符修饰函数 就可以了
同步函数使用的锁匙this
静态同步函数使用的锁不是this,因为静态方法中不可以定义this
静态进内存是,内存中没有本类对象,但是一定有类对应的字节码文件对象
类名.class 该对象的类型是class
单例设计模式,懒汉式
1.   class Single{
  private Single(){}
  public static Single s=null;
  public static synchronized Single getInstance(){
   if (s==null)
    s=new Single();
  } 
 }
2.     class Single{
  private Single(){}
  public static Single s=null;
  public static  Single getInstance(){
     synchronized(Single.class){
     if (s==null)
    s=new Single();
    }
  } 
 }
3.更高效的方法
              class Single{
  private Single(){}
  public static Single s=null;
  public static  Single getInstance(){
   if(s==null){
   synchronized(Single.class){
     if (s==null)
    s=new Single();
    }
   }  
  } 
 }
死锁:同步中嵌套同步,但是锁却不同

进程间的通信:多个线程在操作同一个资源,但是操作的动作不同
 
等待唤醒机制
notifyAll();wait();notify();必须都要使用在同步中
用synchronized中的对象来标记

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值