java多线程2-总结

进程:是一个正在执行中的程序,
       每个上进程执行都有一个执行顺序,顺序是一个执行路径,或者叫一个控制单元.
线程:就是进程中的一个独立的控制单元.
       线程在控制着进程的执行.
      一个进程中至少有一个线程.

java VM启动的地时候会有一个进程java.exe ,该进程中至少一个线程负责java程序的执行.而且这个线程运行的代码在于main方法中.该线程就是主线程main

jvm启动不止一个线程,还有负责GC的线程

多线程就一个目的,多段代码同时执行.相要多段代码同时执行时就用多线程

java多线程2—创建线程

/**
 * 创建线程的线种方式一,继承Thread,重写run方法
 */
public class Test03 {

    public static void main(String[] args) {
        //这是创建一个线程,会有一个独立的线程内存空间
        ThreadDemo demo = new ThreadDemo();
        // 使该线程开始执行;Java 虚拟机调用该线程的 run 方法。
        demo.start();
    }
}
/**
 * 定义一个线程类,(就是继承Thread)
 * Override run方法.run方法中的代码就是这个线程要执行的代码.(线程体)
 */
class ThreadDemo extends Thread{
    @Override
    public void run() {
        System.out.println("一个线程");
    }
}

java多线程3-线程的几种状态

1,被创建—start()—运行—sleep(time)—>冻结

                               -->wait() -->冻结

                                  notify<--   

2,阻塞状态.--等待执行权,有执行权

 

3,冻结-放弃了执行权,

4,消亡状态.

java多线程3-Thread类认识

获取线程对象及名称

线程的默认名称Thread-编号.编号从0开始.

1,getName()方法得到线程名.

2,setName()设置线程名称.

在构造方法方中给线程设置名字

class Test extends Thread{
    //构造方法中,设置线程名字.
    Test(Stirng name){
    //可以直接super()因为父类中已定义
       super(name)
    }
    public void run(0{
      //TODO
    }
}

 

static curentThread():相当于线程中this.获取当前线程对象.静态的

线程状态异常

同一个线程多次.start(),一个线程已经是在运行了,在去调用start().就是IllegalThreadStateException()

java多线程4-创建线程2

第二种创建线程的方法,实现Runnabl接口.

/**
 * 创建线程的第二种方法
 */
public class Test03 {

    public static void main(String[] args) {
        //这里并没有创建线程,只是定义的一个Runnable的子类.
        ThreadDemo demo = new ThreadDemo();
        //这里才是创建了4个线程
        Thread t1 = new Thread(demo);
        Thread t2 = new Thread(demo);
        Thread t3 = new Thread(demo);
        Thread t4 = new Thread(demo);
        //这样才可以同时开启多线程执行同一代码.
        t1.start();
        t2.start();
        t3.start();
        t4.start();
    }
}
/**
 * 实现Runnable接口,Runnable接口只有一个抽象的run方法.
 */
class ThreadDemo implements Runnable{
    @Override
    public void run() {
        System.out.println("一个线程");
    }
}

Runnable接口的定义就是为了规范线程要执行的代码的存入的位置.(就是run方法)

注意:run方法中的异常只能try,

 

多线程中明确的几点:

1,明确哪些代码是多线程运行代码.

2,明确共享数据

3,明确多线程行动代码中哪些语句操作共享数据的.

 

java多线程5-锁

1,同步方法用的是this对象,静态方法同步用的是Class对象

2,死锁:同步中嵌套同步,两个同步的锁确不同.

3,线程访问共享数据的安全,所以要用锁.

java多线程6-线程等待与唤醒

1,线程运行的时候内存中会建立一个线程池,等待线程都在存在这个线程池中notify()唤醒的一般线程池中第一个等待的线程

wait(),notify(),notifyAll()都使用在同步中,因为要对持有的锁的线程操作.

只有同一个锁上的被等待线程,可以被同一个锁上的线程notify唤醒

也就是:等待和唤醒必须是同一个锁.

 

在多线程的时候要注意两点,

1,循环判断标记--所要用while

2,还要唤醒对方线程,也就是要通知的线程,用notifyAll()唤醒所有.为了避免所有线程都wait().不过用notifyall()也有一个缺点会唤醒本方线程.

 

java多线程7-JDK1.5之后

1,显示的锁机制.Lock里面的lock和nulock

2,Object中的wati,notify,notifyAll 替换了Condition对象.

3,该对象可以Lock进行获取,可以实现本方线程只唤醒方线程

java多线程7-线程的停止

1,停止线程只有一个种方法,那就是run方法结束.

2,开启多线程,通常都要用循环结构.(你不用循环的话,就在一个线程里面跑得了,反正你run方法就那几行代码,运行完了还不是单线程)

3,所以只要控制好循环就可以,控制好线程什么时候结束.

interrupt()—这个方法,是中断线程.就是清除线程的冻结状态.让线程运行下去,把run方法运执行完.然后结束线程.

会抛出InterruptException

其它方法:

jion方法--等待该线程结束.在A线程是指使B线程去调用jion方法,那么A线程就会等到B线程结束后在去运行.

setDaemon(true)--那个线程调用这个方法,那么这个线程就会变成后台线程(守护线程).但是不知道它守护那个线程.

yield()--暂停当前正在执行的线程对象,并执行其它线程.

你可能感兴趣的:(java多线程2-总结)