zoukankan      html  css  js  c++  java
  • 线程

    Java多线程开发

    一.并发和进程

    a) 多任务操作系统:可以同时执行运行多个软件。

    b) 进程:运行在PC上的某一个软件。

    c) 单核CPU多任务的机制:使得多个线程轮流使用CPU资源。微观串行,宏观并行

    d) 时间片:进程使用CPU的时间

    二.Java于多进程

    a) Java可是实现多进程开发吗?不可以。

    三.多线程开发

    a) 线程:进程执行过程中的一个程序流程。

    b) 线程的实现:

    1. 继承Thread类,并且覆盖run方法

    Thread_1 t1=new Thread_1("t1");

    Thread_1 t2=new Thread_1("t2");

    //启动线程

    t1.start();

    t2.start();

     

    class Thread_1 extends Thread{

    String name;

    Thread_1(String name){

    this.name=name;

    }

    //线程执行的具体操作

    public void run(){

    for(int i=0;i<5;i++)

    {

    System.out.println(name+" 线程"+i);

    }

    }

    }

     

     

    1. 实现Runnable接口,覆盖run方法

           //创建了一个t1目标对象

    Thread_2 t1=new Thread_2();

    Thread t=new Thread(t1);//让当前线程对象t执行目标对象中的操作

    t.start();

    Thread tt=new Thread(t1);

    tt.start();

     

     

    class Thread_2 implements Runnable{

    public void run(){

    for(int i=0;i<5;i++)

    {

    System.out.println(" 线程"+i);

    }

    }

    }

     

    1. 两种线程实现方式的区别:
      1. 如果需求中需要实现资源共享的要求,最好使用实现Runnable接口的方式。
      2. 如果需要实现多继承操作时,则必须使用Runnable的形式。

     

    三.线程的状态图

     

    四.线程的调度

    a) 线程的优先级:线程对象中优先级越高则该线程就可以获得更多被运行的机会。

    1. 通过线程对象中的setPriority(int p);可以设置线程的优先级。线程优先级的值从低到高依次为:0 5 10 值越高线程优先级越高。

       Bvoid sleep(long millis):参数表示毫秒数,该方法可以使得线程转为阻塞状态。

    Cvoid join()t.join(),让当前线程等待t线程结束之后在结束.当前线程指的就是t.join()该行代码存在的那个线程。

     

    五.线程同步

    a) 原子操作:不可分开执行的代码。

    b) 线程锁机制:

    1. synchronized(obj){ 原子操作代码......}此处的代码块被成为同步代码块。
      1. 作用:如果一个线程要访问同步代码块中的代码,那么该线程必须获取obj所指向的对象的互斥锁标记。
      2. 对象的互斥锁标记:Java中任意一个对象默认都会拥有一个互斥锁标记。互斥:同一时刻内,一个对象的互斥锁标记只可以被一个线程获取。如果某一个对象第一次被某一个线程对象所使用,则该线程对象就会获取该对象的互斥锁标记。如果该线程对象对象被执行结束之后,则释放该对象的互斥锁标记。

     ii.同步方法:synchronized(this){ 原子操作代码......}可以改写成同步方法。Synchronized修饰的方法就是同步方法。

     

    synchnized(obj1){代码块1}

    synchnized(obj1){代码块2}

    synchnized(obj3){代码块3}

     

    如果线程t1正在执行代码块1,则另一个线程t2可不可以进入代码块2?能不你那个进入代码块3

     

    C

    synchnized(a)

    {...; //1

    a.wati();

    synchronized(b){}

    }

     

    synchnized(b)

    {...; //2

    synchronized(a){

    a.notify();

    }

       }

     

    当前线程t1执行到了1的位置,t2线程执行到了2的位置,and then

     

     

    obj.wait():如果该方法被调用,则意味着持有obj对象互斥锁标记的线程会将obj对象的互斥锁释放,然后该线程进入等待状态。

    obj.notify():如果该方法被调用,则意味着正在等该获得obj对象互斥锁标记的那个线程对象可以继续执行了。

    解决死锁:

    synchnized(a)

    {...; //1

    a.wait();

    synchronized(b){}

    }

     

    synchnized(b)

    {...; //2

    synchronized(a){ a.notify(); }

       }

     

  • 相关阅读:
    Oracle冷备份需要保存的文件
    oracle 重建 sys密码文件
    ORA-01991错误
    oracle ORA-01033问题怎么解决
    oracle创建表空间
    oracle 10G服务器端安装以及冷备份恢复
    完全卸载oracle11g步骤
    42. 函数指针用在菜单驱动系统中,练习函数指针数组的使用。
    41. 定义与调用一个函数指针时的几种方式
    40. 使用数组时的四个要点
  • 原文地址:https://www.cnblogs.com/hdj1073678089/p/7406101.html
Copyright © 2011-2022 走看看