zoukankan      html  css  js  c++  java
  • Java 线程基本知识

    线程

    线程和进程

    进程 : 进程指正在运行的程序。确切的来说,当一个程序进入内存运行,即变成一个进程,进程是处于运行过程中的程序,并且具有一定独立功能。

    线程 : 线程是进程中的一个执行单元(执行路径),负责当前进程中程序的执行,一个进程中至少有一个线程。一个进程中是可以有多个线程的,这个应用程序也可以称之为多线程程序。

    线程是程序执行流的最小单

    每一个线程都有自己的执行空间

    线程调度

    在java中进行线程调度的程序为线程调度器.

    线程的优先级程度为1-10,默认的优先级为5, 我们可以改变线程的优先级对线程调度产生影响,但是不能保证线程优先级高的就一定会执行

    实现线程

    新建状态、就绪状态、运行状态、阻塞状态及死亡状态为线程的五种状态

    继承Thread类并且重写run方法

    启动线程的时候需要使用的方法是start() 不能直接调用run()方法

    主要方法

    - start() 启动线程
    
    - Thread.currentThread() 获取当前线程
    
    - getName()    获取线程名字
    
    - Thread.sleep(long m)   让当前线程停止m毫秒
    

    示例

    public class ThreadDemo extends Thread {
        public static void main(String[] args) {
            ThreadDemo demo = new ThreadDemo();
            demo.start();  // 需要启用start() 并不是直接调用run方法
            for (int i = 0; i < 5000; i++) {
                System.out.println("you are ok");
            }
        }
        @Override
        public void run() {
            for (int i = 0; i < 5000; i++) {
                System.out.println("Thread ");
            }
    
        }
    }    
    
    

    实现Runnable接口,并且实现run()方法

    Runnable接口中只设定了一个run()方法,所以要启用线程需要new 一个Thread 然后再其构造方法内传递Runnable

    因为单继承多实现的原则,避免了单继承的局限性,继承接口的实现了线程对象和线程任务的分离,有利于解耦

    示例

    ```
            public class RunnableDemo implements Runnable {
                public static void main(String[] args) {
                     RunnableDemo demo = new RunnableDemo();
                     Thread th = new Thread(demo);
                     th.start();
                }
            
                @Override
                public void run() {
                    for (int i = 1; i < 2000; i++) {
                        System.out.println(1);
                    }
                }
            }
    ```
    

    匿名内部类

    示例

    ```
            new Thread(){
                public void run(){
                    System.out.println("run1");
                }
            }.start();
            
            
            new Thread(new Runnable() {
                @Override
                public void run() {
                    System.out.println("run2");
                }
            }).start();
    
    ```
    

    线程池

    开辟一块内存空间,里面存放了众多(未死亡)的线程,池中线程执行调度由池管理器来处理。当有线程任务时,从池中取一个,执行完成后线程对象归池,这样可以避免反复创建线程对象所带来的性能开销,节省了系统的资源。

    线程池可以调用实现Callable接口的类,

    • Callable 和 Runnable

      • Runnable 和 Callable 都代表那些要在不同的线程中执行的任务

      • Runnable 从 JDK1.0 开始就有了,Callable 是在 JDK1.5 增加的。

      • 它们的主要区别是 Callable 的 call() 方法可以返回值和抛出异常,而 Runnable 的 run() 方法没有这些功能。

      • Callable和Runnable都可以应用于executors。而Thread类只支持Runnable.

    Java提供五种线程池 // 这五种线程池都可以通过Executors来调用方法创建

    • newFixedThreadPool 创建固定大小的线程池,每次提交一个任务就创建一个线程,直到线程达到线程池的最大大小,线程池的大小一旦达到最大值就会保持不变,如果某个线程因为执行异常而结束,那么线程池会补充一个新线程。

    • newCachedThreadPool 创建一个可缓存线程池,如果现有线程没有可用的,则创建一个新线程并添加到池中。终止并从缓存中移除那些已有 60 秒钟未被使用的线程。因此,长时间保持空闲的线程池不会使用任何资源。

    • newSingleThreadExecutor 创建是一个单线程池,也就是该线程池只有一个线程在工作,它相当于newFixedThreadPool方法是传入的参数为1

    • newScheduledThreadPool 创建一个大小无限的线程池,此线程池支持定时以及周期性执行任务的需求。

    • newSingleThreadScheduledExecutor 创建一个单线程化的支持定时的线程池,可以用一个线程周期性执行任务(比如周期7天,一次任务才用1小时,使用多线程就会浪费资源)

    示例

            ExecutorService pool = Executors.newFixedThreadPool(2);
            submit() 传递的为线程类
            Future<String> future = pool.submit(new ThreadCallback(5));
            Future<String> future2 = pool.submit(new ThreadCallback(50));
            System.out.println(future.get());
            System.out.println(future2.get());
    
  • 相关阅读:
    C# learn note
    深入研究Servlet线程安全性问题
    SQL Server中的临时表和表变量
    jQuery笔记
    使用ScriptX控件进行Web打印
    asp.net MVC 设置页面否编译
    Javascript闭包【转载】
    几种开源协议
    扩展IIS7支持的文件类型(转)
    VS2012关闭烦人的文件预览选项卡
  • 原文地址:https://www.cnblogs.com/liyuhui-Z/p/7712650.html
Copyright © 2011-2022 走看看