• java多线程的学习


    1,进程和线程 

    1,一个进程和另外一个进程的之间是隔离的。但是对cpu来说都是一样的。一边打游戏,一边看电影。

    2,两个线程是共享着同一片资源,在同一个进程里面,例如在腾讯视频,同时打开两部电影。

    3,他们的目的都是充分的利用cpu。

    4,java虚拟机就是一个进程。

    5,线程的实现两种方式 Runnable接口,继承Thread类。

    6,在主函数psvm开启的线程,叫主线程。没有多线程的时候,就只有一个主线程。

    start()只是进入执行状态,并不是立即执行,执行得看cpu心情。

    public class PrintChar implements Runnable{
    
        private char c;
        private Integer times;
    
        public PrintChar(char c, Integer times) {
            this.c = c;
            this.times = times;
        }
    
        public PrintChar() {
        }
    
        @Override
        public void run() {
    
            for(int i=0;i<times;i++){
                System.out.println(c);
            }
        }
    }
    public class Start {
    
        public static void main(String[] args) {
            Thread t1 = new Thread(new PrintChar('A',50));
            Thread t2 = new Thread(new PrintChar('B',50));
            t1.start();
            t2.start();
        }
    }

    运行发现,打印A,B是交替,并不是A打印完了,再打印B

    还有一种是方式是继承Thread类

    public class PrintCharOther extends Thread {
    
    
        private char c;
        private Integer times;
    
        public PrintCharOther(char c, Integer times) {
            this.c = c;
            this.times = times;
        }
    
        public PrintCharOther() {
        }
    
        @Override
        public void run() {
    
            for(int i=0;i<times;i++){
                System.out.println(c);
            }
        }
    }
    PrintCharOther t1 = new PrintCharOther('a',100);
            PrintCharOther t2 = new PrintCharOther('b',100);
            t1.start();
            t2.start();

    那么这两种方式那种好呢,java里面是多实现,单继承,一个类只能继承一个父类,一个爹,但是可以实现多个接口。

    实现Runnable接口是非常灵活的。

    看源码发现:

    Thread类也是实现Runnable接口的。

    几种线程里面的方法

     //yield() 执行这个代码的时候,让出线程,让出线程并不代表下一次不执行,可能下一次cpu还可能选中
                //让出cpu的执行权
                Thread.yield();
                    //sleep()方法是让线程睡一会儿,里面的millis是毫秒
                    if (i>=10){
                        Thread.sleep(3000);
                    }

    还有一个设置线程的interrupt()方法,这个方法相对于stop()方法来说,很文雅,

    t1.interrupt();

    只是改了他t1方法的的标志位,不会造成脏数据

    interrupt要配合着使用,真正决定线程运行不运行还是要自己决定,这个下面的代码的意思,

    当当前线程被打断了,我自己break一下,跳出去,终止不终止,由线程本身决定。

    if (Thread.currentThread().isInterrupted()){
        break;
    }

    还有一个方法:

    if (Thread.interrupted()){
         System.out.println(Thread.currentThread().isInterrupted() );
    }

    intertupted()方法,这个是看看是不是interrupt我了,然后顺便清除interrupt状态。点源码进去看看

    就是当当前被intertupt了,就是true,返回true,然后再设置为false,就是说顺便清除interrupt状态

  • 相关阅读:
    97. Interleaving String
    96. Unique Binary Search Trees
    95. Unique Binary Search Trees II
    94. Binary Tree Inorder Traversal
    odoo many2many字段 指定打开的form视图
    docker sentry 配置文件位置
    postgres 计算时差
    postgres 字符操作补位,字符切割
    postgres判断字符串是否为时间,数字
    odoo fields_view_get
  • 原文地址:https://www.cnblogs.com/fuckingPangzi/p/10079051.html
Copyright © 2020-2023  润新知