java多线程技能(一)

1. 多线程定义
线程是在进程中独立运行的基本单位,多线程是指这个进程运行时产生的不止一个线程。
2. 进程定义
进程是操作系统的基础;是一次程序的执行;是系统进行资源分配和调度的基本单位。
3. 并发与并行
并行:多个cpu实例或者多台机器同时执行一端处理逻辑,是真正的同时。
并发:通过cpu调度算法,让用户看上去执行,实际上cpu操作层面并不是真正的同时。
4. 多线程实现
(1)继承Tread类,重写run()方法。
启动线程唯一的方法是是通过thread类的start()方法,start()方法并不是立即执行多线程代码,是使得线程变成运行态。

public class MyThread extends Thread {  
  public void run() {  
   System.out.println("MyThread.run()");  
  }  
} 
MyThread myThread1 = new MyThread();  
MyThread myThread2 = new MyThread();  
myThread1.start();  
myThread2.start(); 

(2)实现runnable()接口,实现该接口的run()方法。(一般采用)

public class MyThread extends OtherClass implements Runnable {  
  public void run() {  
   System.out.println("MyThread.run()");  
  }  
}  
MyThread myThread = new MyThread();  
Thread thread = new Thread(myThread);  
thread.start(); 

(3)实现callable()接口,从写call()方法。
好处 (1)任务结束可以提供一个返回值。
(2)可以抛出异常。
(3)拿到future对象,表示异步计算的结果。

5.多线程安全
代码经过多线程使用,线程的调度顺序都不影响结果。
6. currentThread()方法
返回代码段正在被哪个线程调用的信息。

public class MyThread extends Thread{
    public MyThread() {
        System.out.println("构造方法的打印"+currentThread().getName());
    }
    @Override
    public void run(){
        System.out.println("run方法的打印"+currentThread().getName());
    }
}
    public static void main(String[] args) {
        MyThread myThread=new MyThread();       
        myThread.start();
        //myThread.run();
    }
}

*当调用myThread.start(),打印为
构造方法的打印main
run方法的打印Thread-0
当调用myThread.run(),打印为
构造方法的打印main
run方法的打印main*
说明:run()方法不会另起一个线程。
7.isAlive()方法:判断当前线程是否处于活动状态
8. 停止线程
停止线程的方法:
8.1:使用退出标志,使线程正常退出,也就是完成run方法后线程终止。
8.2使用stop强制停止(该方法不安全,已经被作废,使用后释放锁可能造成数据不一致的结果),suspend和resume方法(已经作废,暂停线程).
8.3使用interrput方法中断线程,可以和抛异常和return联合使用。
8.4 异常方法停止线程。
this.interrupted():测试当前线程是否已经中断。“”重点是当前线程“”,如果连续两次调用该方法,第二次将返回false.改方法具有清除状态的功能。执行完以后会将状态标志清除为fasle的功能。

public class MyThread extends Thread{
    public MyThread() {
        System.out.println("构造方法的打印"+currentThread().getName());
    }
    @Override
    public void run(){
        super.run();
        for(int i=0;i<2000;i++){
            System.out.println("i"+(i+1));
        }
    }
}
public class Test {
    public static void main(String[] args) {
        try {
            MyThread myThread=new MyThread();       
            myThread.start();
            Thread.sleep(500);
            //myThread.interrupt();
            myThread.currentThread().interrupt();
            System.out.println("是否停止1"+myThread.interrupted());
            System.out.println("是否停止2"+myThread.interrupted());
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("end");
    }
}



this.isInterrupted():测试线程是否已经中断,但不清除状态标志。
9. suspend和resume方法
作用:可以暂停线程,然后使用resume()回复线程。
缺点:独占,造成死锁;不同步。
10. yiled方法:放弃当前cpu的资源,将其给其他的任务去占用cpu执行时间。放弃时间不确定,可能刚刚放弃,又马上获取cpu的时间片。
11. 线程优先级
特点:(1)线程优先级具有继承性(2)优先级具有随机性:高优先级的线程大部分先执行完,不代表全部执行完,当优先级等级差距很大时,执行顺序和代码调用顺序无关。
12. 守护线程
线程分为:用户线程,守护线程。
守护线程:特征是“陪伴”,当进程中不存在非守护线程时,守护线程自动销毁。典型的守护线程时垃圾回收线程,守护线程时JVM的保姆,它随JVM一同结束工作。

你可能感兴趣的:(java,多线程)