在Java中,关于线程的创建,方法及生命周期

来源:互联网 发布:java代码块执行顺序 编辑:程序博客网 时间:2024/06/05 10:34
前言:
    可自行查看Thread类的源码,查看线程如何使用


关于线程创建的方式一:继承Thread类
其代码示例如下:
package com.atguigu.java1;/* * 创建一个子线程,完成1-100之间自然数的输出。同样地,主线程执行同样的操作 * 创建多线程的第一种方式:继承java.lang.Thread类 *///1.创建一个继承于Thread的子类class SubThread extends Thread{    //2.重写Thread类的run()方法.方法内实现此子线程要完成的功能    public void run(){        for(int i = 1;i <= 100;i++){            System.out.println(Thread.currentThread().getName() +":" + i);        }    }}public class TestThread {    public static void main(String[] args) {        //3.创建子类的对象        SubThread st1 = new SubThread();        SubThread st2 = new SubThread();        //4.调用线程的start():启动此线程;调用相应的run()方法        //一个线程只能够执行一次start()        //不能通过Thread实现类对象的run()去启动一个线程        st1.start();        //st.start();        //st.run();        st2.start();        for(int i = 1;i <= 100;i++){        System.out.println(Thread.currentThread().getName() +":" + i);        }    }}



关于线程创建的方式二:实现Runnable
代码示例如下:
package com.atguigu.java;/* * 创建多线程的方式二:通过实现的方式 *  * 对比一下继承的方式 vs 实现的方式 * 1.联系:public class Thread implements Runnable * 2.哪个方式好?实现的方式优于继承的方式 *    why?  ① 避免了java单继承的局限性 *     ② 如果多个线程要操作同一份资源(或数据),更适合使用实现的方式 *///1.创建一个实现了Runnable接口的类class PrintNum1 implements Runnable {    //2.实现接口的抽象方法    public void run() {    // 子线程执行的代码        for (int i = 1; i <= 100; i++) {            if (i % 2 == 0) {                System.out.println(Thread.currentThread().getName() + ":" + i);            }        }    }}public class TestThread1 {    public static void main(String[] args) {        //3.创建一个Runnable接口实现类的对象        PrintNum1 p = new PrintNum1();        // p.start();        // p.run();        //要想启动一个多线程,必须调用start()        //4.将此对象作为形参传递给Thread类的构造器中,创建Thread类的对象,此对象即为一个线程        Thread t1 = new Thread(p);        //5.调用start()方法:启动线程并执行run()        t1.start();//启动线程;执行Thread对象生成时构造器形参的对象的run()方法。        //再创建一个线程        Thread t2 = new Thread(p);        t2.start();    }}



关于线程的方法的使用:
其代码示例如下:
package com.atguigu.java1;/* * Thread的常用方法: * 1.start():启动线程并执行相应的run()方法 * 2.run():子线程要执行的代码放入run()方法中 * 3.currentThread():静态的,调取当前的线程 * 4.getName():获取此线程的名字 * 5.setName():设置此线程的名字 * 6.yield():调用此方法的线程释放当前CPU的执行权 * 7.join():在A线程中调用B线程的join()方法,表示:当执行到此方法,A线程停止执行,直至B线程执行完毕, * A线程再接着join()之后的代码执行 * 8.isAlive():判断当前线程是否还存活 * 9.sleep(long l):显式的让当前线程睡眠l毫秒 * 10.线程通信:wait()   notify()  notifyAll() *  * 设置线程的优先级 * getPriority() :返回线程优先值    setPriority(int newPriority) :改变线程的优先级 */class SubThread1 extends Thread {    public void run() {        for (int i = 1; i <= 100; i++) {            // try {                // Thread.currentThread().sleep(1000);            // } catch (InterruptedException e) {                // // TODO Auto-generated catch block                // e.printStackTrace();            // }            System.out.println(Thread.currentThread().getName() + ":"            + Thread.currentThread().getPriority() + ":" + i);        }    }}public class TestThread1 {    public static void main(String[] args) {        SubThread1 st1 = new SubThread1();        st1.setName("子线程1");        st1.setPriority(Thread.MAX_PRIORITY);        st1.start();        Thread.currentThread().setName("========主线程");        for (int i = 1; i <= 100; i++) {        System.out.println(Thread.currentThread().getName() + ":"        + Thread.currentThread().getPriority() + ":" + i);        // if(i % 10 == 0){        // Thread.currentThread().yield();        // }        // if(i == 20){            // try {                // st1.join();            // } catch (InterruptedException e) {                // // TODO Auto-generated catch block                // e.printStackTrace();            // }        // }    }    System.out.println(st1.isAlive());    }}



线程的生命周期:


0 0
原创粉丝点击