线程

来源:互联网 发布:取名软件推荐 编辑:程序博客网 时间:2024/05/17 07:03

进程: 正在运行的程序。每个进程可以由多个线程组成;

线程:是进程中的单个顺序控制流,是一条执行路径。

并行:指在某一个时间段内同时发生的事件 —时间段
并发:指在某一个时间点同时发生的事件 —时间点

一、实现多线程有2中方式
1.继承继承Thread类,重写run()方法,run()是包含被线程执行的代码

public class MyThread extends Thread {    public MyThread() {        super();    }    public MyThread(String name) {        super(name);    }    @Override    //run()用来包含那些被线程执行的代码。    public void run() {    for (int i = 0; i < 10; i++) {        System.out.println(Thread.currentThread().getName()+"  :"+i);    }    }}
        MyThread my1 = new MyThread();        MyThread my2 = new MyThread();        //设置线程名称        my1.setName("my1");        my2.setName("my2");        my1.start();        my2.start();        //打印当前线程名字        System.out.println(Thread.currentThread().getName());

输出:
main
my2 :0
my2 :1
my2 :2
my2 :3
my2 :4
my2 :5
my2 :6
my2 :7
my2 :8
my2 :9
my1 :0
my1 :1
my1 :2
my1 :3
my1 :4
my1 :5
my1 :6
my1 :7
my1 :8
my1 :9

2.实现Runnable接口,重写run()方法

public class MyRunnable implements Runnable {    @Override    public void run() {        for (int x = 0; x < 10; x++) {            System.out.println(Thread.currentThread().getName() + ":" + x);        }    }}
    public static void main(String[] args) {        // 创建MyRunnable类的对象        MyRunnable my = new MyRunnable();        Thread t1 = new Thread(my, "线程1");        Thread t2 = new Thread(my, "线程2");        t1.start();        t2.start();        //打印当前线程名字        System.out.println(Thread.currentThread().getName());    }输出:main线程1:0线程1:1线程1:2线程1:3线程1:4线程1:5线程1:6线程1:7线程1:8线程1:9线程2:0线程2:1线程2:2线程2:3线程2:4线程2:5线程2:6线程2:7线程2:8线程2:9

三、多线程的方法

测试功能的线程:

public class MyThread extends Thread {    @Override    public void run() {        for (int x = 0; x < 5; x++) {            System.out.println(getName() + ":" + x);        }    }}
  1. public final void setDaemon(boolean on):将该线程标记为守护线程或用户线程。当正在运行的线程都是守护线程时,Java 虚拟机退出。 该方法必须在启动线程前调用。
    MyThread my1 = new MyThread();        MyThread my2 = new MyThread();        my1.setName("线程1");        my2.setName("线程2");        // 设置守护线程        my1.setDaemon(true);        my2.setDaemon(true);//      Thread.currentThread().setDaemon(true);//当正在运行的线程都是守护线程时,Java 虚拟机退出。        my1.start();        my2.start();        for (int x = 0; x < 5; x++) {            System.out.println(Thread.currentThread().getName() + ":" + x);        }    }输出:main:0main:1线程1:0线程2:0线程2:1线程2:2main:2线程2:3线程2:4线程1:1线程1:2线程1:3线程1:4main:3main:4

2.public final void join():等待该线程终止。

        MyThread my1=new MyThread();        MyThread my2=new MyThread();        MyThread my3=new MyThread();        my1.setName("线程1");        my2.setName("线程2");        my3.setName("线程3");        my1.start();        try {            //等待该线程终止。 my1线程结束完才会执行下去            my1.join();        } catch (InterruptedException e) {            e.printStackTrace();        }        my2.start();        my3.start();    }输出:线程1:0线程1:1线程1:2线程1:3线程1:4线程2:0线程2:1线程2:2线程2:3线程3:0线程2:4线程3:1线程3:2线程3:3线程3:4

3.线程优先级:代表获取cpu时间片几率的高低.
public final int getPriority():返回线程对象的优先级
public final void setPriority(int newPriority):更改线程的优先级。
注意:
线程默认优先级是5。
线程优先级的范围是:1-10。

    public static void main(String[] args) {        MyThread my1 = new MyThread();        MyThread my2 = new MyThread();        MyThread my3 = new MyThread();        my1.setName("线程1");        my2.setName("线程2");        my3.setName("线程3");        // 获取默认优先级         System.out.println("线程1优先级"+my1.getPriority());         System.out.println("线程2优先级"+my2.getPriority());         System.out.println("线程3优先级"+my3.getPriority());        //设置正确的线程优先级        my1.setPriority(10);        my3.setPriority(1);         System.out.println("线程1优先级"+my1.getPriority());         System.out.println("线程2优先级"+my2.getPriority());         System.out.println("线程3优先级"+my3.getPriority());         System.out.println("------------------测试---------------");        my1.start();        my2.start();        my3.start();    }}输出:线程1优先级5线程2优先级5线程3优先级5线程1优先级10线程2优先级5线程3优先级1------------------测试---------------线程1:0线程1:1线程3:0线程1:2线程1:3线程1:4线程2:0线程2:1线程2:2线程2:3线程2:4线程3:1线程3:2线程3:3线程3:4

4.线程休眠 public static void sleep(long millis),此时线程会停止,等时间过了,在继续

        MyThread my1 = new MyThread();        MyThread my2 = new MyThread();        MyThread my3 = new MyThread();        my1.setName("线程1");        my2.setName("线程2");        my3.setName("线程3");        my1.start();        my1.sleep(3*1000);        System.out.println("线程1结束完了");        my2.start();        my3.start();输出:线程1:0线程1:1线程1:2线程1:3线程1:4线程1结束完了线程2:0线程3:0线程2:1线程3:1线程2:2线程3:2线程2:3线程3:3线程2:4线程3:4

5线程停止

public void interrupt():中断线程。如果当前线程没有中断它自己(这在任何情况下都是允许的),则该线程的 checkAccess 方法就会被调用,这可能抛出 SecurityException。

如果线程在调用 Object 类的 wait()、wait(long) 或 wait(long, int) 方法,或者该类的 join()、join(long)、join(long, int)、sleep(long) 或 sleep(long, int) 方法过程中受阻,则其中断状态将被清除,它还将收到一个 InterruptedException。

    MyThread my1 = new MyThread();        MyThread my2 = new MyThread();        my1.setName("线程1");        my2.setName("线程2");        my1.start();        //中断线程状态        my1.interrupt();        //中断线程状态        System.out.println(my1.interrupted());        System.out.println("线程1结束完了");        my2.start();输出;false线程1结束完了线程1:0java.lang.InterruptedException: sleep interrupted    at java.lang.Thread.sleep(Native Method)    at cn.itcast_04.MyThread.run(MyThread.java:8)线程2:0线程1:1线程2:1线程1:2线程2:2线程1:3线程2:3线程1:4线程2:4

6.public static void yield():暂停当前正在执行的线程对象,并执行其他线程。

public class MyThread extends Thread {    @Override    public void run() {        for (int x = 0; x < 10; x++) {            System.out.println(getName() + ":" + x);            Thread.yield();        }    }}        MyThread ty1 = new MyThread();        MyThread ty2 = new MyThread();        ty1.setName("线程1");        ty2.setName("线程2");        ty1.start();        ty2.start();输出:线程1:0线程2:0线程1:1线程2:1线程2:2线程2:3线程2:4线程2:5线程1:2线程2:6线程1:3线程1:4线程2:7线程1:5线程2:8线程2:9线程1:6线程1:7线程1:8线程1:9
0 0
原创粉丝点击