专栏首页李家的小酒馆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());

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 面试知识整理-Java基础

    三大特征:封装,继承,多态 多态:简单的说就是用同样的对象引用调用同样的方法但是做了不同的事情。 抽象:抽象是将一类对象的共同特征总结出来构造类的过程 包装,可...

    李家酒馆酒保
  • 多线程的同步和死锁

    多线程同步和死锁 在多线程编程中,有可能会出现同时访问同一个资源的情况,这种资源可以是各种类型的的资源:一个变量、一个对象、一个文件、一个数据库表等,而当多个线...

    李家酒馆酒保
  • Java面试基本知识

    Java基本知识 基本知识 服务器:Tomcat 支持Servlet jsp JBoss 开源应用服务器 Apache:最广泛的http服务器,只支持静态网页 ...

    李家酒馆酒保
  • Java基础--线程创建方式

    线程的创建主要有两种形式,通过继承Thread或者实现Runnable接口,本质上没有太大区别。

    河岸飞流
  • 多线程?怎么用?

    进程是指一个内存中运行的应用程序,每个进程都有自己独立的一块内存空间,一个进程中可以启动多个线程。比如在Windows系统中,一个运行的exe就是一个进程。

    故里
  • 读书笔记《Java并发编程的艺术 - 方腾飞》- Java并发编程

    在Java中, 我们可以通过 priority 属性来设置线程的优先级, 参数为 1 ~ 10 参数越大, 代表优先级越高, 默认的优先级为 5

    lvgo
  • 多线程开发,先学会线程池吧

    在实际开发场景中,我们经常要使用多线程开发应用,比如实现异步操作,或者为了提高程序的效率等等。但是以前我见过有实习生在使用的时候是直接new Runable()...

    java技术爱好者
  • 并发编程面试题汇总

    thinkwon.blog.csdn.net/article/details/104863992

    Java旅途
  • Thread方法

    这个方法返回线程的 ID 值,类型为 long。线程的 ID 在线程的整个生命周期中都不变。

    宇宙之一粟
  • 线程

    并发编程在开发一般的项目确实接触很少,也导致平时学习的机会也不多,基本上都是碰到相关问题时会查一些相关资料去解决,所以很少会对这本分知识有系统和全面的了解。虽说...

    胖虎

扫码关注云+社区

领取腾讯云代金券