• 线程


    注: syso会严重影响多线程,具体可查看:https://blog.csdn.net/w05980598/article/details/79933693

    1. 为什么使用线程:

      使用线程充分利用计算机的cpu资源提高效率

      阻塞代码避免应先其他代码执行,方法线程中,并行执行

    2. 创建线程

    •   继承Thread

        继承Thread,编写线程子类

        重写run()方法,在run()方法中添加线程中并行执行的代码

    •   实现Runable

        定义Runable接口子类

        实现run()方法

        新建Thread对象时,把Runnable对象交给线程对象

        线程对象启动后,执行Runnable对象的run()方法

    3.线程的方法

      Thread.currentThread()  获取正在执行的线程对象

      Thread.sleep(long t)  正在执行的线程,暂停指定的毫秒时长

      

      setName()

      getName()

      start()  启动线程

      interrupt()  打断一个线程的暂停状态 

      join()  在当前线程中,等待被调用线程结束

      getPriority()  线程的优先级,1-10,默认为5

      setPriority(p)  线程的优先级,1-10,默认为5

      setDaemon(true)  把线程设置成后台线程、守护线程,所有的前台线程结束,虚拟机就会自动关闭,不会等待后台线程。

      

     4.线程生命周期

     

     5. 线程共享数据冲突

      一个线程修改数据,另一个线程访问到了被修改了一半的数据

    6. 线程同步

      一个线程访问数据时,其他线程要等待

      JAVA中所有的对象,都有一个同步锁

      让多个线程争夺同一个对象的同步锁,谁抢到谁执行,得不到锁就等待。

      1.同步代码块

        synchronized(争夺的对象){
          数据访问代码
        }

      2.同步方法

        //非静态方法,争夺的是当前对象的锁
        synchronized void f(){          }
        //静态方法,争夺“类对象”的锁    
        static synchronized void f(){
        
        }

     案例:

    package com.demo;
    
    import java.security.GeneralSecurityException;
    import java.text.SimpleDateFormat;
    import java.util.Date;
    import java.util.Scanner;
    import java.util.concurrent.ExecutorService;
    import java.util.concurrent.Executors;
    
    public class ThreadDemo4 {
        public static void main(String[] args) {
            Test5 test5 = new Test5();
            Test5 test6 = new Test5();
            Thread t5 = new Thread(test5);
            Thread t6 = new Thread(test6);
            t5.start();
            while (true) {
                int i = test5.getI();
                System.out.println(i);
                if(i%2==1){
                    System.out.println("iiiii : "+i);
                    //退出虚拟机
                    System.exit(0);
                }
            }
        }
        static class Test5 implements Runnable{
            static int i=0;
            //i ++
            public synchronized void add() {
                i++;
                i++;
            }
            //获取i的值
            public synchronized int getI(){
                return i;
            }
            @Override
            public void run() {
                while (true){
                    add();
                }
            }
        }
    }

    7. 等待和通知

    Object 的方法

    wait()
      线程在被调用的对象上等待
    
    notify()
      通知在对象上等待的一个线程
    
    notifyAll()
      通知在对象上等待的所有的线程

    注:

      必须在synchronized 代码块内调用

      必须在加锁的对象上等待、通知

      wait()外面应该使用while(){} 循环条件进行检查

    8.同步监视器

    执行到synchronized,会在加锁的对象上,关联一个同步监视器。

      

  • 相关阅读:
    跟踪创建类的个数
    动手动脑3
    动手动脑:随机数发生器和函数重载
    统计英语文章中单词
    动手动脑(1)
    原码、反码、补码
    java测试ATM自助操作系统
    深入浅出 TCP/IP 协议栈
    十大经典排序算法(动图演示)
    深入浅出 Viewport 设计原理
  • 原文地址:https://www.cnblogs.com/gxlaqj/p/11427359.html
Copyright © 2020-2023  润新知