Thread

作者: 闫鹏飞写字的地方 | 来源:发表于2021-09-01 22:53 被阅读0次

    Java中线程实现的方式

    方式1.实现 Runnable 接口(类名RunnableImp)
    class MyThread implements Runnable { // 实现Runnable接口,作为线程的实现类
        private String name;       // 表示线程的名称
    
        public MyThread(String name) {
            this.name = name;      // 通过构造方法配置name属性
        }
    
        public void run() {  // 覆写run()方法,作为线程 的操作主体
            for (int i = 0; i < 10; i++) {
                System.out.println(name + "运行,i = " + i);
            }
        }
    };
    
    public class RunnableImp {
        public static void main(String args[]) {
            MyThread mt1 = new MyThread("线程A ");    // 实例化对象
            MyThread mt2 = new MyThread("线程B ");    // 实例化对象
            Thread t1 = new Thread(mt1);       // 实例化Thread类对象
            Thread t2 = new Thread(mt2);       // 实例化Thread类对象
            t1.start();    // 启动多线程
            t2.start();    // 启动多线程
        }
    }
    
    方式2.继承 Thread 类(MyThread1)
    class ExtendsThread extends Thread{  // 继承Thread类,作为线程的实现类
        private String name ;       // 表示线程的名称
        public ExtendsThread(String name){
            this.name = name ;      // 通过构造方法配置name属性
        }
        public void run(){  // 覆写run()方法,作为线程 的操作主体
            for(int i=0;i<10;i++){
                System.out.println(name + "运行,i = " + i) ;
            }
        }
    };
    public class MyThread1 {
        public static void main(String args[]){
            ExtendsThread mt1 = new ExtendsThread("线程A ") ;    // 实例化对象
            ExtendsThread mt2 = new ExtendsThread("线程B ") ;    // 实例化对象
            mt1.start() ;   // 调用线程主体
            mt2.start() ;   // 调用线程主体
        }
    };
    

    区别:继承 Thread类,则不适合于多个线程共享资源,而实现了 Runnable 接口,就可以方便的实现资源的共享。

    线程的状态变化

    创建状态 、就绪状态 、运行状态 、阻塞状态 、死亡状态

    线程的操作方法

    1. 线程插队join(Test)
    public class Test {
    
        public static void main(String[] args) {
    
            for (int i = 0; i < 20; i++) {
    
                Thread t1 = new Thread(new R("a"));
                Thread t2 = new Thread(new R("b"));
                Thread t3 = new Thread(new R("c"));
    
                try {
                    t1.start();
                    t1.join();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
    
                try {
                    t2.start();
                    t2.join();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
    
                t3.start();
            }
    
        }
    
    }
    
    class R implements Runnable{
        String abc;
    
        public R(String abc) {
            this.abc = abc;
        }
    
        public void run() {
            p(abc);
        }
    
        private void p(String abc){
            System.out.print(abc);
        }
    }
    

    2.线程睡眠sleep(ThreadSleepDemo)

    class MyThreadD implements Runnable{ // 实现Runnable接口
        public void run(){  // 覆写run()方法
            for(int i=0;i<50;i++){
                try{
                    Thread.sleep(500) ; // 线程休眠
                }catch(InterruptedException e){
                }
                System.out.println(Thread.currentThread().getName()
                        + "运行,i = " + i) ;  // 取得当前线程的名字
            }
        }
    };
    public class ThreadSleepDemo{
        public static void main(String args[]){
            MyThreadD mt = new MyThreadD() ;  // 实例化Runnable子类对象
            Thread t = new Thread(mt,"线程");     // 实例化Thread对象
            t.start() ; // 启动线程
        }
    }
    
    1. 线程中断interrupt(ThreadInterruptDemo)
    class MyThreadI implements Runnable{ // 实现Runnable接口
        public void run(){  // 覆写run()方法
            System.out.println("1、进入run()方法") ;
            try{
                Thread.sleep(10000) ;   // 线程休眠10秒
                System.out.println("2、已经完成了休眠") ;
            }catch(InterruptedException e){
                System.out.println("3、休眠被终止") ;
                return ; // 返回调用处
            }
            System.out.println("4、run()方法正常结束") ;
        }
    };
    public class ThreadInterruptDemo{
        public static void main(String args[]){
            MyThreadI mt = new MyThreadI() ;  // 实例化Runnable子类对象
            Thread t = new Thread(mt,"线程");     // 实例化Thread对象
            t.start() ; // 启动线程
            try{
                Thread.sleep(2000) ;    // 线程休眠2秒
            }catch(InterruptedException e){
                System.out.println("3、休眠被终止") ;
            }
            t.interrupt() ; // 中断线程执行
        }
    };
    
    4.后台线程setDaemon(ThreadDaemonDemo)
    class MyThreadDa implements Runnable{ // 实现Runnable接口
        public void run(){  // 覆写run()方法
            while(true){
                System.out.println(Thread.currentThread().getName() + "在运行。") ;
            }
        }
    };
    public class ThreadDaemonDemo{
        public static void main(String args[]){
            MyThreadDa mt = new MyThreadDa() ;  // 实例化Runnable子类对象
            Thread t = new Thread(mt,"线程");     // 实例化Thread对象
            t.setDaemon(true) ; // 此线程在后台运行
            t.start() ; // 启动线程
        }
    };
    
    5.线程的优先级setPriority(ThreadPriorityDemo)
    class MyThreadP implements Runnable{ // 实现Runnable接口
        public void run(){  // 覆写run()方法
            for(int i=0;i<5;i++){
                try{
                    Thread.sleep(500) ; // 线程休眠
                }catch(InterruptedException e){
                }
                System.out.println(Thread.currentThread().getName()
                        + "运行,i = " + i) ;  // 取得当前线程的名字
            }
        }
    };
    public class ThreadPriorityDemo{
        public static void main(String args[]){
            Thread t1 = new Thread(new MyThreadP(),"线程A") ;  // 实例化线程对象
            Thread t2 = new Thread(new MyThreadP(),"线程B") ;  // 实例化线程对象
            Thread t3 = new Thread(new MyThreadP(),"线程C") ;  // 实例化线程对象
            t1.setPriority(Thread.MIN_PRIORITY) ;   // 优先级最低
            t2.setPriority(Thread.MAX_PRIORITY) ;   // 优先级最高
            t3.setPriority(Thread.NORM_PRIORITY) ;  // 优先级最中等
            t1.start() ;    // 启动线程
            t2.start() ;    // 启动线程
            t3.start() ;    // 启动线程
        }
    };
    
    6.线程的礼让yield(ThreadYieldDemo)
    class MyThreadY implements Runnable{ // 实现Runnable接口
        public void run(){  // 覆写run()方法
            for(int i=0;i<5;i++){
                try{
                    Thread.sleep(500) ;
                }catch(Exception e){
                }
                System.out.println(Thread.currentThread().getName()
                        + "运行,i = " + i) ;  // 取得当前线程的名字
                if(i==2){
                    System.out.print("线程礼让:") ;
                    Thread.currentThread().yield() ;    // 线程礼让
                }
            }
        }
    };
    public class ThreadYieldDemo{
        public static void main(String args[]){
            MyThreadY my = new MyThreadY() ;  // 实例化MyThread对象
            Thread t1 = new Thread(my,"线程A") ;
            Thread t2 = new Thread(my,"线程B") ;
            t1.start() ;
            t2.start() ;
        }
    };
    
    6.同步synchronized(SyncDemo02)
    class MyThreadS implements Runnable{
        private int ticket = 5 ;    // 假设一共有5张票
        public void run(){
            for(int i=0;i<100;i++){
                synchronized(this){ // 要对当前对象进行同步
                    if(ticket>0){   // 还有票
                        try{
                            Thread.sleep(300) ; // 加入延迟
                        }catch(InterruptedException e){
                            e.printStackTrace() ;
                        }
                        System.out.println("卖票:ticket = " + ticket-- );
                    }
                }
            }
        }
    };
    public class SyncDemo02{
        public static void main(String args[]){
            MyThreadS mt = new MyThreadS() ;  // 定义线程对象
            Thread t1 = new Thread(mt) ;    // 定义Thread对象
            Thread t2 = new Thread(mt) ;    // 定义Thread对象
            Thread t3 = new Thread(mt) ;    // 定义Thread对象
            t1.start() ;
            t2.start() ;
            t3.start() ;
        }
    };
    

    死锁(ThreadDeadLock)

    class Zhangsan{ // 定义张三类
        public void say(){
            System.out.println("张三对李四说:“你给我画,我就把书给你。”") ;
        }
        public void get(){
            System.out.println("张三得到画了。") ;
        }
    };
    class Lisi{ // 定义李四类
        public void say(){
            System.out.println("李四对张三说:“你给我书,我就把画给你”") ;
        }
        public void get(){
            System.out.println("李四得到书了。") ;
        }
    };
    public class ThreadDeadLock implements Runnable{
        private static Zhangsan zs = new Zhangsan() ;       // 实例化static型对象
        private static Lisi ls = new Lisi() ;       // 实例化static型对象
        private boolean flag = false ;  // 声明标志位,判断那个先说话
        public void run(){  // 覆写run()方法
            if(flag){
                synchronized(zs){   // 同步张三
                    zs.say() ;
                    try{
                        Thread.sleep(500) ;
                    }catch(InterruptedException e){
                        e.printStackTrace() ;
                    }
                    synchronized(ls){
                        zs.get() ;
                    }
                }
            }else{
                synchronized(ls){
                    ls.say() ;
                    try{
                        Thread.sleep(500) ;
                    }catch(InterruptedException e){
                        e.printStackTrace() ;
                    }
                    synchronized(zs){
                        ls.get() ;
                    }
                }
            }
        }
        public static void main(String args[]){
            ThreadDeadLock t1 = new ThreadDeadLock() ;      // 控制张三
            ThreadDeadLock t2 = new ThreadDeadLock() ;      // 控制李四
            t1.flag = true ;
            t2.flag = false ;
            Thread thA = new Thread(t1) ;
            Thread thB = new Thread(t2) ;
            thA.start() ;
            thB.start() ;
        }
    };
    

    相关文章

      网友评论

          本文标题:Thread

          本文链接:https://www.haomeiwen.com/subject/lgufwltx.html