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());
Java 线程基本知识的更多相关文章
- java线程基础知识----线程与锁
我们上一章已经谈到java线程的基础知识,我们学习了Thread的基础知识,今天我们开始学习java线程和锁. 1. 首先我们应该了解一下Object类的一些性质以其方法,首先我们知道Object类的 ...
- java线程基础知识----线程基础知识
不知道从什么时候开始,学习知识变成了一个短期记忆的过程,总是容易忘记自己当初学懂的知识(fuck!),不知道是自己没有经常使用还是当初理解的不够深入.今天准备再对java的线程进行一下系统的学习,希望 ...
- java线程基础知识----java daemon线程
java线程是一个运用很广泛的重点知识,我们很有必要了解java的daemon线程. 1.首先我们必须清楚的认识到java的线程分为两类: 用户线程和daemon线程 A. 用户线程: 用户线程可以简 ...
- Java线程基础知识(状态、共享与协作)
1.基础概念 CPU核心数和线程数的关系 核心数:线程数=1:1 ;使用了超线程技术后---> 1:2 CPU时间片轮转机制 又称RR调度,会导致上下文切换 什么是进程和线程 进程:程序运行资源 ...
- java线程入门知识
为什么需要多线程? . 模型的简化,如某些程序是由多个相对独立任务的运行: . 图形界面的出现,输入.输出的阻塞 . 多核CPU的更好利用 . 异步行为的需要 Java多线程的特性: . 程序的入口m ...
- Java 线程基础知识
前言 什么是线程?线程,有时被称为轻量进程(Lightweight Process,LWP),是程序执行流的最小单元.一个标准的线程由线程 ID,当前指令指针 (PC),寄存器集合和堆栈组成.另外,线 ...
- java线程基础知识----java线程模型
转载自http://www.cnblogs.com/nexiyi/p/java_memory_model_and_thread.html 1. 概述 多任务和高并发是衡量一台计算机处理器的能力重要指标 ...
- java线程基本知识
如何去定义一个线程?(三种方式) 1.Thread:继承这个类,然后重写run方法:将业务逻辑或任务写到run方法中,然后调用start来启动线程: 2.Runnable: 实现这个接口, ...
- java线程基础知识----SecurityManager类详解
在查看java Thread源码的时候发现一个类----securityManager,虽然很早就知道存在这样一个类但是都没有深究,今天查看了它的api和源码,发现这个类功能强大,可以做很多权限控制策 ...
随机推荐
- 201521123057 《Java程序设计》第5周学习总结
1. 本周学习总结 1.1 尝试使用思维导图总结有关多态与接口的知识点. 2. 书面作业 1.代码阅读:Child压缩包内源代码 1.1 com.parent包中Child.java文件能否编译通过? ...
- 201521123104《Java程序设计》第4周学习总结
1. 本周学习总结 1.1 尝试使用思维导图总结有关继承的知识点. 1.2 使用常规方法总结其他上课内容. (1)继承时子类将获得父类的属性与方法,并具有自身特有的属性与方法. (2)使用super还 ...
- 201521123073 《Java程序设计》第13周学习总结
1. 13周学习总结 以你喜欢的方式(思维导图.OneNote或其他)归纳总结多网络相关内容. 2. 书面作业 1. 网络基础 1.1 比较ping www.baidu.com与ping cec.jm ...
- 手写Maven的archetype项目脚手架
一.背景 maven是一个很好的代码构建工具,采用“约定优先于配置”的原则进行项目管理,相信很多的java开发者应该都了解maven并可能在工作当中都是通过maven来管理项目的,在创建的项目的时候, ...
- 14.LINUX-platform机制实现驱动层分离(详解)
版权声明:本文为博主原创文章,未经博主允许不得转载. 本节目标: 学习platform机制,如何实现驱动层分离 1.先来看看我们之前分析输入子系统的分层概念,如下图所示: 如上图所示,分 ...
- vue2.0 网页标题更新实现思路
一.注册全局指令 1.注册一个全局指令 Vue.directive('title', { inserted: function (el, binding) { document.title = el. ...
- java学习——java按值传递和按址传递
先复制一个面试/笔试的题: 当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这里到底是值传递还是引用传递? 答案: 是值传递.Java语言的方法调用只支持参 ...
- netty4.x 传输文件
一:简介 netty传输文件的例子并不多,当前的项目刚才需要使用netty,所以就记录一下使用方法,使用netty传输文件,首先需要启动一个服务端,等待服务端请求监听,然后传输文件的时候,启动一个客户 ...
- hdu 2609 How many 最小表示法
How many Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Su ...
- bzoj2730(矿场搭建)
矿场搭建,不知道为什么,莫名其妙T了在212上,额,zyh数据真的坑. bzoj200轻松跑过啊. 就是点双联通分量缩点,然后标记割点,一个块如果有>=2个割点,则不需要挖矿洞, 如果只有一割点 ...