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 条评论
登录 后参与评论

相关文章

来自专栏Python小屋

Python实现定时自动关闭的tkinter窗口

功能简要说明:程序运行后10秒钟自动关闭。 技术要点:tkinter应用程序的destroy()方法,多线程编程。 代码截图: ? 运行效果: ?

39260
来自专栏开发与安全

《Learn python the hard way》Exercise 48: Advanced User Input

这几天有点时间,想学点Python基础,今天看到了《learn python the hard way》的 Ex48,这篇文章主要记录一些工具的安装,以及sca...

21000
来自专栏云计算教程系列

在Linux中使用find命令行查找文件

find是一个基于条件机制递归过滤文件系统中对象的命令。使用find搜索文件系统中的文件或目录。使用-exec标志,可以在同一命令中找到并立即处理文件。

14220
来自专栏Rgc

redis权限认证及登录

64110
来自专栏王小雷

Redis4集群安装部署实战

redis服务器的集群主从配置,从redis的安装到实例开启,到集群创建。集群配置如图: ? Redis集群优点摘自官网 So in practical t...

333100
来自专栏软件工程师成长笔记

什么是线程安全?如何保证线程安全?

2.1K20
来自专栏流浪猫的golang

go test 使用全教程

golang 中的go test 为golang 软件包提供了一种单元测试方式,非常简单的同时也非常好用。 ok 先来看看怎么用? 1. 新建go 文件...

9940
来自专栏JadePeng的技术博客

Jupyter notebook安装与使用

Jupyter Notebook(此前被称为 IPython notebook)是一个交互式笔记本,支持运行 40 多种编程语言。 安装 安装python...

40260
来自专栏我的技术专栏

vi 方向键和Backspace键失效问题的解决方法

10820
来自专栏XAI

修改UCenter用户名长度限制的方法php程序和数据库修改

做了discuz api for java  第三方应用项目的注册登陆。 但是在修改用户名长度的时候。出现了小bug。找到解决发现是自身原因。 ? 在discu...

291100

扫码关注云+社区

领取腾讯云代金券