多线程概述

  • 抢占式多任务

    直接中断而不需要事先和被中断程序协商

  • 协作多任务

    被中断程序同意交出控制权之后才能执行中断

  • 多线程和多进程区别?

    本质的区别在于每个进程有它自己的变量的完备集,线程则共享相同的数据

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 多线程初级汇总的更多相关文章

  1. java多线程知识点汇总(一)多线程基础

    1.什么叫多线程程序? 答:一个进程至少有一个线程在运行,当一个进程中出现多个线程时,就称这个应用程序是多线程应用程序. java编写的程序都是多线程的,因为最少有俩线程,main主线程和gc线程. ...

  2. java多线程知识点汇总(四)多线程知识点脉络图

    1.多线程安全问题 1)synchronized关键字:如何加锁的问题,选择synchronized方法还是synchnized代码块. 选择哪个锁问题,this对象,还是class对象(针对stat ...

  3. java多线程知识汇总(三)如何选择锁?如何加锁

    1.锁,保证的是被锁的代码,一次执行完毕才能被其他线程执行,锁保证了一个线程执行过程中不被其他线程打断.以保证数据的准确性. 2.数据的读写过程,是有冲突的,当一个线程正在读数据,另一个线程正在写同一 ...

  4. java多线程知识点汇总(二)多线程实例解析

    本实验主要考察多线程对单例模式的操作,和多线程对同一资源的读取,两个知识.实验涉及到三个类: 1)一个pojo类Student,包括set/get方法. 2)一个线程类,设置student的成员变量a ...

  5. C# 多线程初级汇总

    异步委托 创建线程的一种简单方式是定义一个委托,并异步调用它 委托是方法的类型安全的引用 Delegate类还支持异步地调用方法.在后台,Delegate类会创建一个执行任务的线程 投票,并检查委托是 ...

  6. java 多线程40个问题汇总(转)

    java 多线程40个问题汇总,自己也记录一份,如有侵权,联系删除 ref from :http://www.cnblogs.com/xrq730/p/5060921.html 1.多线程作用 - 利 ...

  7. Java多线程编程基础知识汇总

    多线程简介 多任务   现代操作系统(Windows.Linux.MacOS)都可以执行多任务,多任务就是同时运行多个任务.例如在我们的计算机上,一般都同时跑着多个程序,例如浏览器,视频播放器,音乐播 ...

  8. 40个Java多线程问题总结

    前言 Java多线程分类中写了21篇多线程的文章,21篇文章的内容很多,个人认为,学习,内容越多.越杂的知识,越需要进行深刻的总结,这样才能记忆深刻,将知识变成自己的.这篇文章主要是对多线程的问题进行 ...

  9. Java多线程学习笔记

    进程:正在执行中的程序,其实是应用程序在内存中运行的那片空间.(只负责空间分配) 线程:进程中的一个执行单元,负责进程汇总的程序的运行,一个进程当中至少要有一个线程. 多线程:一个进程中时可以有多个线 ...

随机推荐

  1. Java设置以及获取JavaBean私有属性进阶

    在上一篇博客中讲到使用Java提供的原生API设置以及获取一个JavaBean的私有属性. 但是使用Java的原生API过于复杂,有没有更加简单的方法呢?答案是肯定的.下面介绍一个开元工具包来非常方便 ...

  2. Android 在测试阶段当出现多个测试服务器地址时打包的小技巧

    前提:服务端没有做特殊处理 在开发android网络客户端项目时,不可避免的会用到“测试服务器地址”和“云端服务器地址”等.(有时可能会有多个) 这时在打包给测试那帮哥们时,你就需要一个服务器地址打上 ...

  3. Shell调试篇 转

    检查语法 -n选项只做语法检查,而不执行脚本. sh -n script_name.sh 启动调试 sh -x script_name.sh 进入调试模式后,Shell依次执行读入的语句,产生的输出中 ...

  4. iOS开发之使用UIView-Positioning简化页面布局

    使用过代码布局的人可能会有这样的感觉,给控件设置frame的时候比较繁琐.最 近在Github上看到有一个UIView的一个分类UIView-Positioning,这个分类提供了一些属性,比如lef ...

  5. c# HttpWebRequest Cookie 设置到 webBrowser 控件

    [DllImport("wininet.dll", CharSet = CharSet.Auto, SetLastError = true)] public static exte ...

  6. C++自学成长之路(第一篇)

    今天开始我将开启C++自学成长之路,今天是第一天,在以前就一直在网上查找关于c++的资料,想买一本好一点的,权威一点的资料书,通过努力查找,我选择了c++ primer,在网上这本书的好评如潮.更多的 ...

  7. [Oracle]坏块处理:确认坏块的对象

    如果已经知道 FILE#,BLOCK#,则 可以通过如下查询来看: SQL> SELECT SEGMENT_TYPE,OWNER||'.'||SEGMENT_NAME FROM DBA_EXTE ...

  8. Codeforces 955C Sad powers (数论)

    题目链接:Sad powers 题意:给出n个l和r,求出每个给出的[l,r]之间的可以使是另外一个数的k次方的数.(k>=2) 题解:题目给出的数据范围最大是1E18所以如果要直接把所有的从1 ...

  9. 4字节emoji表情对应的Unicode编码获取和编码转换

    GitHub Flavored Markdown 今天研究了一天Markdown移动端和pc端统一实现方式,由于以前有搞过移动端富文本编辑器,搞Markdown简单多了: 其中GFM的表情语法不错,比 ...

  10. Asp.Net_后台代码访问前台html标签

    //单击按钮后批量改变li元素的内联文本值及样式 ; i <= ; i++) { HtmlGenericControl li = this.FindControl("li" ...