Java 线程

线程:一个程序的内部控制流

    概念:线程是进程中执行运算的最小单位,是进程中的一个实体,是被系统独立调度和分派的基本单位,线程自己不拥有系统资源,只拥有一点在运行中必不可少的资源,但它可与同属一个进程的其它线程共享进程所拥有的全部资源。


进程:


线程和进程区别:

    1、进程拥有独立的代码和数据空间,进程切换开销较大;同一进程中的线程共享代码和数据空间,线程切换开销较小;

   2、多进程:能同时运行多个任务(程序);多线程:同一进程中多个顺序流同时执行;

   3、一个线程可以创建和撤消另一个线程;同一进程中的多个线程之间可以并发执行;

    4、线程作为调度和分配的基本单位;进程作为拥有资源的基本单位;


关系:

    1、一个线程只能属于一个进程,而一个进程可以有多个线程,但至少有一个线程;

    2、资源分配给进程,同一进程的所有线程共享该进程的所有资源;

    3、处理机分给线程,即真正在处理机上运行的是线程;

    4、线程在执行过程中,需要协作同步。不同进程的线程间要利用消息通信的办法实现同步。线程是指进程内的一个执行单元,也是进程内的可调度实体


Java中线程的创建:

    java.lang.thread类:一个thread对象即代表一个线程

   run方法:执行线程内部的操作;

   start方法:启动线程

创建线程的方法1: 实现Runnable接口

import java.lang.*;


public class TestThread1 {
    public static void main(String[] args) {
        Runner1 r1 = new Runner1();
        Runner2 r2 = new Runner2();


        /*实现Runnable接口,需要创建Thread对象,才能调用start方法
        //r1.run();
        //直接调用run方法,子线程先执行,执行完毕即继续执行主线程
        
        Thread t = new Thread(r1);
        t.start();
        //线程启动,通知cpu开始执行此线程
        */


        //继承Thread类,可以直接调用start方法
        r2.start();
        
        for(int i = 0; i < 100; i++) {
            System.out.println("Main Thread-------- " + i);
        }


    }
}


//创建线程的方法1:实现Runnable接口
class Runner1 implements Runnable {
    public void run() {
        for(int i = 0; i < 100; i++) {
            System.out.println("Runner1: " + i);
        }                                  
    }
}


//创建线程的方法2:继承Thread类
class Runner2 extends Thread {
    public void run() {
        for(int i = 0; i < 100; i++) {
            System.out.println("Runner2: " + i);
        }
    }
}

创建线程的方法2: 继承Thread类


线程的状态:



线程的基本控制方法:


sleep方法:静态方法,被打断会抛出异常

import java.lang.*;
import java.util.*;

public class TestSleep {
    public static void main(String[] args) {
        MyThread thread = new MyThread();
        thread.start();

        try {Thread.sleep(10000);}
        //主线程(main)睡眠
        catch (InterruptedException ex) {}

        thread.interrupt();
        //打断子线程
        //不适合用来结束线程 
    }
}

class MyThread extends Thread {
    public void run() {
        while(true) {
            System.out.println("===" + new Date() + "===");
            try {
                sleep(1000);
            } catch (InterruptedException ex) {
                return;
            }
        }
    }
}

join方法:合并某个线程

public class TestJoin {
    public static void main(String[] args) {
        MyThread thread = new MyThread("abcde");
        thread.start();

        try {
            thread.join();
            //将子线程合并进来,即等待子线程执行完毕
        } catch (InterruptedException ex) {

        }

        for(int i = 0; i < 10; i++) {
            System.out.println("i am main thread");
        }       
    }
}

class MyThread extends Thread {
    MyThread(String s) {
        super(s);
    }
    //给线程起名字

    public void run() {    
        for(int i = 0; i < 10; i++) {
            System.out.println("i am " + getName());
            try {
                sleep(1000);
            } catch (InterruptedException ex) {
                return;
            }
        }
    } 
}

yield方法:让出cpu,让其他线程执行

public class TestYield {
    public static void main(String[] args) {
        MyThread thread1 = new MyThread("---t1");
        MyThread thread2 = new MyThread("t2");

        thread1.start();
        thread2.start();
    }
}

class MyThread extends Thread {
    MyThread(String s) {
        super(s);
    }

    public void run() {
        for(int i = 1; i <= 100; i++) {   
            System.out.println(getName() + " " + i);
            if(i % 10 == 0) {
                //能被10整除时,立马让其他线程执行
                yield();
            }
        }
    }
}

线程的优先级:

    优先级越高,得到的cpu执行时间片越长,范围1-10,默认为5

public class TestPriority {
    public static void main(String[] args) {
        Thread t1 = new Thread(new T1());
        Thread t2 = new Thread(new T2());

        t1.setPriority(Thread.NORM_PRIORITY + 3);
        //设置优先级
        t1.start();
        t2.start();
    }
}

class T1 implements Runnable {
    public void run() {
        for(int i = 0; i < 1000; i++) {
            System.out.println("T1: " + i);
        }
    }
}

class T2 implements Runnable {
    public void run() {
        for(int i = 0; i < 1000; i++) {
            System.out.println("------T2: " + i);
        }
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值