• 多线程编程


    1.区分线程与进程

    线程:基于线程的多任务处理器中,线程为最小的处理单位,【特点】是进程内部单一的一个顺序控制流。

    进程:指正在被运行的程序。每个进程都有自己独立的一块内存空间,每个进程的内部数据和状态都是完全独立的。

    二者区别:线程存在于进程之中。每个进程都需要操作系统为其分配独立的内存空间,二同一进程中的所有线程都在同一内存空间中工作,这些线程可以共享同一内存和系统资源。

    2.线程编程相关API

    核心类:Thread类、Object类...

    接口:Runnable接口...

    A:Thread类中的方法

               1). interrup:中断线程。

               2).run:如果该线程是使用独立的 Runnable 运行对象构造的,则调用该 Runnable 对象的 run 方法;否则,该方法不执行任何操作并返回。 

                   Thread 的子类应该重写该方法。

               3).start:使该线程开始执行;Java 虚拟机调用该线程的 run 方法。

               4). yield:暂停当前正在执行的线程对象,并执行其他线程。

               5). sleep:在指定的毫秒数内让当前正在执行的线程休眠(暂停执行),此操作受到系统计时器和调度程序精度和准确性的影响。

               6). join:让其他线程插入本线程之前。

               7).wait:在其他线程调用此对象的 notify() 方法或 notifyAll() 方法前,导致当前线程等待。

               8). notify:唤醒在此对象监视器上等待的单个线程。

               9).notifyAll:唤醒在此对象监视器上等待的所有线程。

                .......

    B:Runnable接口

         只定义了一个方法run()

    C:Object类

               1).wait:就是使当前线程等待该对象的锁,当前线程必须是该对象的拥有者,也就是具有该对象的锁。wait()方法一直等待,直到获得锁或者被中断。wait(long timeout)                设定一个超时间隔,如果在规定时间内没有获得锁就返回。

                   调用该方法后当前线程进入睡眠状态,直到以下事件发生。

                    a:其他线程调用了该对象的notify方法。

                    b:其他线程调用了该对象的notifyAll方法。

                    c:其他线程调用了interrupt中断该线程。

                    d:时间间隔到了。

                   此时该线程就可以被调度了,如果是被中断的话就抛出一个InterruptedException异常。

               2).notify:该方法唤醒在该对象上等待的某个线程。

               3).notifyAll:该方法唤醒在该对象上等待的所有线程。

    3.线程的优先级

    例:

    public class Main {
    
        /**
         * Starts two threads, setting priorities on them 
         * and wait for them to finish.
         * 
         */
        public void setPrioritiesOnThreads() {
    
            Thread thread1 = new Thread(new TestThread(1));
            Thread thread2 = new Thread(new TestThread(2));
    
            //Setting priorities on the Thread objects
            thread1.setPriority(Thread.MAX_PRIORITY);
            thread2.setPriority(Thread.MIN_PRIORITY);
    
            thread1.start();
            thread2.start();
    
            try {
    
                //Wait for the threads to finish
                thread1.join();
                thread2.join();
    
            } catch (InterruptedException ex) {
                ex.printStackTrace();
            }
    
            System.out.println("Done.");
    
        }
        /**
         * Starts the program
         *
         * @param args the command line arguments
         */
        public static void main(String[] args) {
            new Main().setPrioritiesOnThreads();
        }
    
        class TestThread implements Runnable {
    
            int id;
    
            public TestThread(int id) {
    
                this.id = id;
            }
    
            public void run() {
    
                for (int i = 1; i <= 10; i++) {
                    System.out.println("Thread" + id + ": " + i);
                }
            }
        }
    }

    4.线程的生命周期

  • 相关阅读:
    C# Task.Run 和 Task.Factory.StartNew 区别
    数据库面试题(实时更新)
    python面试题(实时更新)
    opencv简介以及环境搭建
    Django分页器
    django的开发环境
    Django简介以及MVC模式
    Virtualbox修改虚拟机分配内存的大小
    深浅拷贝
    react-native-typescript-项目环境搭建
  • 原文地址:https://www.cnblogs.com/moshengren-java/p/4458084.html
Copyright © 2020-2023  润新知