1.4 高并发之线程和进程

1、多线程

一、1 线程与进程区别

  进程:每一个正在系统上运行的程序都是一个进程。每一个进程包含一到多个线程。安全

  线程:线程是一组指令的集合,或者是程序的特殊段,它能够在程序里独立执行多线程

总结:进程是全部线程的集合,每个线程是进程中的一条执行路径多线程的好处是能够提升程序的效率异步

一个应用系统能够多个进程:进程中必定有一个主线程(JAVA中Main函数)。线程是一个进程执行顺序,流程,路径,而且每一个线程不影响。ide

一、2 生活中实例:

迅雷种子多个下载,买票系统,应用系统,Ajax异步上传函数

一、3 实现多线程的方式

  同步执行:单线程(同一时刻只能执行一个方法,时间相加)spa

  异步执行:多线程(同一时刻同时执行多个方法,不相互影响,时间随最后执行完时间结束)线程

    实现Runnable接口比继承Thread类好,由于接口能够多继承。orm

 

  开始执行线程  开启线程不是调用run方法,而是start方法对象

  建立方法:    一、第一种继承Thread类 重写run方法、范例代码:注意 开启线程不是调用run方法,而是start方法继承

package com.lele.JavaAll1203Test;

/**
* @author LIULE
* @version v0.1
* @classDesc 建立多线程例子(重写Thread的run方法)
*/
class CreateThrea extends Thread{
public void run(){
for( int i = 0;i<=200;i++){
System.out.println("i的值为"+i);
}
}
}
public class Test01Threath {
public static void main(String[]args){
System.out.println("多线程createThread开始");
CreateThrea t = new CreateThrea();
System.out.println("开始执行多线程");
t.start();
for( int i = 0;i<=200;i++){
System.out.println("MAIN"+i);
}
System.out.println("多线程createThread结束");
}
}

 

二、实现Runnable接口,重写run方法,代码范例

/**
* @author LIULE
* @version v0.1
* @classDesc 建立多线程例子(实现Runnable接口
*/
public class Test02Runnable {
public static void main(String[]args){
System.out.println("建立一个多线程---");
creatRunnable c = new creatRunnable();
System.out.println("多线程开始调用---");
Thread thread = new Thread(c);
thread.start();
for(int i = 0 ; i <= 200 ;i++ ){
System.out.println("i的主方法的值为"+i);
}
System.out.println("多线程调用结束--");
}

}
class creatRunnable implements Runnable{
@Override
public void run(){
for(int i = 0 ; i <= 200 ;i++ ){
System.out.println("i的子线程值为"+i);
}
}
}

 三、使用匿名内部类

public class Test03InNoname {
public static void main(String[]args){
System.out.println("多线程开始");
Thread thread = new Thread(new Runnable() {
@Override
public void run() {
for ( int i = 0; i < 20;i++){
System.out.println("内部子线程i"+i);
}
}
});
thread.start();
for ( int i = 0; i < 20;i++){
System.out.println("内部主线程i"+i);
}
}
}

线程经常使用API的方法:

start()启动线程

currentThread()获取当前线程对象

getID()获取当前线程ID      Thread-编号  该编号从0开始

getName()获取当前线程名称

sleep(long mill)休眠线程

Stop()中止线程,(不安全,已不使用)

2、守护线程

Java中有两种线程,一种是用户线程(非守护线程,用户线程是指用户自定义建立的线程,主线程中止,用户线程不会中止)

另外一种是守护线程(和主线程一块儿销毁GC回收线程)。守护线程当进程不存在或主线程中止,守护线程也会被中止。

使用setDaemon(true)方法设置为守护线程

3、多线程状态

  线程从建立、运行到结束老是处于下面五个状态之一:新建状态(ew Thread(r))、就绪状态(start()方法)、运行状态(真正开始执行run()方法)、

  阻塞状态    线程运行过程当中,可能因为各类缘由进入阻塞状态:

        1>线程经过调用sleep方法进入睡眠状态;

        2>线程调用一个在I/O上被阻塞的操做,即该操做在输入输出操做完成以前不会返回到它的调用者;

        3>线程试图获得一个锁,而该锁正被其余线程持有;

        4>线程在等待某个触发条件;

死亡状态,须要使用isAlive方法

   1) run方法正常退出而天然死亡,

     2) 一个未捕获的异常终止了run方法而使线程猝死。

4、JOIN方法

join做用是让其余线程变为等待,

t1.join();// 让其余线程变为等待,直到当前t1线程执行完毕,才释放。

thread.Join把指定的线程加入到当前线程,能够将两个交替执行的线程合并为顺序执行的线程。好比在线程B中调用了线程A的Join()方法,直到线程A执行完毕后,才会继续执行线程B。join方法写在相应的下一个执行的方法中。

相关文章
相关标签/搜索