多线程总结笔记

进程与多线程

进程是程序的一次动态执行过程,需要从经历代码加载,代码执行到执行完毕的一个完整过程。

多线程能同时运行多个进程。

多线程说实现并发机制的一种有效手段,线程和进程一样,都是实现并发的一个基本单位。

通过继承thrund来实现多线程的定义

一个类只要继承了thread类,此类就称为多线程实现类。在Thread类中必须明确覆写Thread中的run()方法,此方法称为线程的主体。

extends Thread

package Thread;

public class thread1 extends Thread {

  private String name;

  public thread1(String name){ //用构造方法设置属性内容

​    this.name=name;

  }

  @Override

  public void run() {

​    for (int i = 0; i <10; i++) {

​      System.*out*.println(name + "运行,i=" +i);

​    }

  }

}

package Thread;

public class ThreadDemo1 {

  public static void main(String[] args) {

​    thread1 mt1 =new thread1("线程1");

​    thread1 mt2 =new thread1("线程2");

​    mt1.run();

​    mt2.run();

  }

}


顺序执行,如果要正确的启动多线程,是不能调用run()方法的。任何情况下,thrund多线程都是调用start函数

public class ThreadDemo1 {

  public static void main(String[] args) {

​    thread1 mt1 =new thread1("线程A");

​    thread1 mt2 =new thread1("线程B");

​    mt1.start();

​    mt2.start();

  }

}

结果是交替运行,虽然调用了start()方法,但是主体是run()方法。

如果一个类通过继承thread类实现,那么只能调用一次start()方法,如果调用多次就会出现“illegalThradStartException”异常。

继承runnable接口实现多线程

implements Runnable

public class Mythread2 implements Runnable{

​    private String name;

​    public Mythread2(String name){ //用构造方法设置属性内容

​      this.name=name;  //为name属性赋值

​    }

​    @Override

​    public void run() {

​      for (int i = 0; i <10; i++) {

​        System.*out*.println(name + "运行,i=" +i);

​      }

​    }

  }

public class RunnableDemo {

  public static void main(String[] args) {

​    Mythread2 mt1 = new Mythread2("线程A”); 实例化runnable 子类对象

​    Mythread2 mt2 = new Mythread2("线程B");

​    Thread t1 = new Thread(mt1);  实例化thread类对象

​    Thread t2 = new Thread(mt2);

​    t1.start();

​    t2.start();

  }

}


thread类和runnable接口之间在使用上也是有区别的,如果一个类继承了Thread类,则不适合多个线程共享资源,而实现了runnable接口的话,就可以方便的实现资源共享。

public class Mythread3 implements Runnable{

  private int ticket = 5;

  public void run(){

​    for (int i = 0; i < 100; i++) {

​      if(ticket>0){

​        System.*out*.println("卖票:ticket=" + ticket--);

​      }

​    }

  }

public class RunnableDemo2 {

  public static void main(String[] args) {

​    Mythread3 my = new Mythread3();

​    new Thread(my).start();  //启动三个线程,实现资源共享

​    new Thread(my).start();

​    new Thread(my).start();

  }

}


判断线程是否启动

isAlive()方法测试线程是否已经启动,而且仍在运行。

线程的强制运行

Join() 方法让线程强制运行,在这期间,其他线程无法运行,

public class RunnableJoin {

  public static void main(String[] args) {

​    Mythread4 mt = new Mythread4();

​    Thread t = new Thread(mt,"线程");

​    t.start();

​    for (int i = 0; i < 10 ; i++) {

​      if(i>5){

​        try {

​          t.join();

​        }catch (Exception e){}

​      }

​      System.*out*.println("main " + i);

​    }

  }

};

线程休眠

Thread.sleep()方法实现线程的休眠。

中断线程

interrupt()

public class Mythread5 implements Runnable {

  @Override

  public void run() {

​    System.*out*.println("1, 进入run方法");

​    try{

​     Thread.*sleep*(1000);

​      System.*out*.println("2,完成休眠");

​    }catch (Exception e){

​      System.*out*.println("3.休眠被终止");

​      return;

​    }

​    System.*out*.println("4.run方法被终止");

  }

}

public class ThreadInterrupt {

  public static void main(String[] args) {

​    Mythread5 my = new Mythread5();

​    Thread t = new Thread(my , "线程");

​    t.start();

​    try {

​      Thread.*sleep*(2000);

​    }catch (Exception e){

​    }

​    t.interrupt();

  }

}

后台线程

setDaemon()

线程的优先级

Setpriority()方法可以设置一个线程的优先级,

线程的同步与死锁

同步就是指多个操作在同一个时间段内只能有一个线程进行,其他线程要等待此线程完成之后才可以继续执行。

同步代码块 synchronized(同步对象){需要同步的代码}

同步方法 synchronized 方法返回值 方法名称(参数列表){}

死锁指两个线程都在等待对方先完成,造成了程序的停滞。

posted @ 2020-07-04 15:11  木子酱  阅读(180)  评论(0编辑  收藏  举报