Java 多线程初级汇总
多线程概述
抢占式多任务
直接中断而不需要事先和被中断程序协商
协作多任务
被中断程序同意交出控制权之后才能执行中断
多线程和多进程区别?
本质的区别在于每个进程有它自己的变量的完备集,线程则共享相同的数据
Thread
Thread(Runnable target)
构造有一个新的线程来调用指定的target的run()方法
void start()
启动这个线程,将引发调用run()方法
void run()
调用关联Runnable的run方法
Thread 示例测试代码
public class ThreadTest extends Thread {
private Thread mThread;
private String mName;
private final int mCount = 4;
public ThreadTest(String name){
this.mName = name;
System.out.println("new ThreadTest"+name);
}
public void run(){
System.out.println("run " + this.mName);
try {
for (int i = 0; i < mCount; i++) {
System.out.println(this.mName + "Thread.sleep : " + i);
Thread.sleep(50);
}
} catch (InterruptedException ie) {
System.out.println("InterruptedException " + this.mName);
}
}
public void start() {
System.out.println("start " + this.mName);
if (this.mThread == null) {
this.mThread = new Thread(this);
this.mThread.start();
}
}
public static void main(String[] args) {
ThreadTest thread1 = new ThreadTest("test1");
thread1.start();
ThreadTest thread2 = new ThreadTest("test2");
thread2.start();
}
}
Runnable
Runnable封装一个异步运行的任务
Runnable示例测试代码
/**
* Runnable继承类
*/
public class RunnableTest implements Runnable {
private Thread mThread;
private String mName;
private final int mCount = 4;
public RunnableTest(String name) {
this.mName = name;
System.out.println("new RunnableTest" + name);
}
public void run() {
System.out.println("run " + this.mName);
try {
for (int i = 0; i < mCount; i++) {
System.out.println(this.mName + "Thread.sleep : " + i);
Thread.sleep(50);
}
} catch (InterruptedException ie) {
System.out.println("InterruptedException " + this.mName);
}
}
public void start() {
System.out.println("start " + this.mName);
if (this.mThread == null) {
this.mThread = new Thread(this);
this.mThread.start();
}
}
public static void main(String[] args) {
RunnableTest run1 = new RunnableTest("test1");
run1.start();
RunnableTest run2 = new RunnableTest("test2");
run2.start();
}
}
Callable和Future
Callable接口是一个参数化的类型,有一个方法call
Future保存异步计算的结果。当使用Future对象,启动有一个计算,把计算结果给某线程,Future对象在所有者结果计算好之后就可以得到它
call()
运行一个将产生结果的任务
代码示例
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask;
public class CallableTest implements Callable<Integer> {
public Integer call() throws Exception {
int i = 0;
for (; i < 100; i++) {
System.out.println(Thread.currentThread().getName() + " " + i);
}
return i;
}
public static void main(String[] args) {
CallableTest test = new CallableTest();
FutureTask<Integer> task = new FutureTask<Integer>(test);
for (int i = 0; i < 100; i++) {
System.out.println(Thread.currentThread().getName() + " 的循环变量i的值" + i);
if (i == 20) {
new Thread(task, "有返回值的线程").start();
}
}
try {
System.out.println("子线程的返回值:" + task.get());
} catch (InterruptedException e) {
e.printStackTrace();
} catch (ExecutionException e) {
e.printStackTrace();
}
}
}
线程池
如果你的程序创建了大量生存期很短的线程,就应该使用线程池一个线程池包含大量准备运行的空闲线程。将一个Runnable对象给线程池,线程池中的一个线程就会调用run方法。
- newCachedThreadPool 构建,如果有空闲线程可用,立即让它执行任务,否则创建一个新线程
- newFixedThreadPool 创建一个大小固定的线程池。如果提交的任务数大于空闲线程数,那么得不到服务的任务将被置于队列中
- newSingleTreadExecutor是一个退化了大小为1的线程池
Java 多线程初级汇总的更多相关文章
- java多线程知识点汇总(一)多线程基础
1.什么叫多线程程序? 答:一个进程至少有一个线程在运行,当一个进程中出现多个线程时,就称这个应用程序是多线程应用程序. java编写的程序都是多线程的,因为最少有俩线程,main主线程和gc线程. ...
- java多线程知识点汇总(四)多线程知识点脉络图
1.多线程安全问题 1)synchronized关键字:如何加锁的问题,选择synchronized方法还是synchnized代码块. 选择哪个锁问题,this对象,还是class对象(针对stat ...
- java多线程知识汇总(三)如何选择锁?如何加锁
1.锁,保证的是被锁的代码,一次执行完毕才能被其他线程执行,锁保证了一个线程执行过程中不被其他线程打断.以保证数据的准确性. 2.数据的读写过程,是有冲突的,当一个线程正在读数据,另一个线程正在写同一 ...
- java多线程知识点汇总(二)多线程实例解析
本实验主要考察多线程对单例模式的操作,和多线程对同一资源的读取,两个知识.实验涉及到三个类: 1)一个pojo类Student,包括set/get方法. 2)一个线程类,设置student的成员变量a ...
- C# 多线程初级汇总
异步委托 创建线程的一种简单方式是定义一个委托,并异步调用它 委托是方法的类型安全的引用 Delegate类还支持异步地调用方法.在后台,Delegate类会创建一个执行任务的线程 投票,并检查委托是 ...
- java 多线程40个问题汇总(转)
java 多线程40个问题汇总,自己也记录一份,如有侵权,联系删除 ref from :http://www.cnblogs.com/xrq730/p/5060921.html 1.多线程作用 - 利 ...
- Java多线程编程基础知识汇总
多线程简介 多任务 现代操作系统(Windows.Linux.MacOS)都可以执行多任务,多任务就是同时运行多个任务.例如在我们的计算机上,一般都同时跑着多个程序,例如浏览器,视频播放器,音乐播 ...
- 40个Java多线程问题总结
前言 Java多线程分类中写了21篇多线程的文章,21篇文章的内容很多,个人认为,学习,内容越多.越杂的知识,越需要进行深刻的总结,这样才能记忆深刻,将知识变成自己的.这篇文章主要是对多线程的问题进行 ...
- Java多线程学习笔记
进程:正在执行中的程序,其实是应用程序在内存中运行的那片空间.(只负责空间分配) 线程:进程中的一个执行单元,负责进程汇总的程序的运行,一个进程当中至少要有一个线程. 多线程:一个进程中时可以有多个线 ...
随机推荐
- kubespray -- 快速部署高可用k8s集群 + 扩容节点 scale.yaml
主机 系统版本 配置 ip Mater.Node,ansible CentOS 7.2 4 ...
- php连接mysql...mysqli和mysql
mysql_connect()这一系列函数已经不推荐使用了,不安全. <?php $con = mysql_connect('localhost','root','');// 选择连接数据库系统 ...
- 20155202张旭《网络对抗技术》 week1 PC平台逆向破解及Bof基础实践
20155202张旭<网络对抗技术> week1 PC平台逆向破解及Bof基础实践 1.实践目标: 实践对象:一个名为pwn1的linux可执行文件. 该程序正常执行流程是: main调用 ...
- 20155233 《网络对抗》 Exp8 Web基础
实验内容 Web前端HTML Web前端javascipt Web后端:MySQL基础:正常安装.启动MySQL,建库.创建用户.修改密码.建表 Web后端:编写PHP网页,连接数据库,进行用户认证 ...
- 20155331《网络对抗》Exp5 MSF基础应用
20155331<网络对抗>Exp5 MSF基础应用 基础问题回答 用自己的话解释什么是exploit,payload,encode 答:exploit就是漏洞利用.exploit就是利用 ...
- 浅谈Spring中的事务回滚
使用Spring管理事务过程中,碰到过一些坑,因此也稍微总结一下,方便后续查阅. 1.代码中事务控制的3种方式 编程式事务:就是直接在代码里手动开启事务,手动提交,手动回滚.优点就是可以灵活控 ...
- Android与单片机通信常用数据转换方法(汇总)
下面直接贴代码 1. 将GB2312转化为中文,如BAFAC2DCB2B7→胡萝卜,两个字节合成一个文字 public static String stringToGbk(String string ...
- Asp.Net_Ajax调用WebService返回Json前台获取循环解析
利用JQuery的$.ajax()可以很方便的调用 asp.net的后台方法.但往往从后台返回的json字符串不能够正确解析,究其原因,是因为没有对返回的json数据做进一步的加工.其实,这里只需 要 ...
- 记录:tf.saved_model 模块的简单使用(TensorFlow 模型存储与恢复)
虽然说 TensorFlow 2.0 即将问世,但是有一些模块的内容却是不大变化的.其中就有 tf.saved_model 模块,主要用于模型的存储和恢复.为了防止学习记录文件丢失或者蠢笨的脑子直接遗 ...
- fiddler之会话数据的修改
fiddler之会话数据的修改 fiddler记录http的请求,并且针对特定的http请求,可以分析请求数据.修改数据.调试web系统等,功能十分强大.本篇主要讲两种修改的数据的方法,断点和Unlo ...