Java中的多线程总结(转)
1、多线程概述
当一个程序运行时,内部可能包含了多个顺序执行流,每个顺序执行流就是一个线程。主要以下几个优点:
- 线程之间很容易实现共享内存
- 创建线程代价较小
- Java语言内置多线程功能支持
2、线程的创建和启动
Ø 定义Thread的子类,并重写run方法
Ø 创建Thread子类的实例,即创建了线程对象
Ø 用线程对象的start方法来启动该线程

1 public class DemoThread extends Thread
2 {
3 private int i;
4 String name;
5 public DemoThread(String name)
6 {
7 super(name);
8 }
9 public void run()
10 {
11 for(;i<100;i++)
12 System.out.println(Thread.currentThread().getName()+"-------"+i);
13
14 }
15 public static void main(String[] args)
16 {
17 for(int i=0;i<100;i++)
18 {
19 System.out.println(Thread.currentThread().getName()+"-----------"+i);
20
21 if(i==20)
22 {
23 new DemoThread("windows1").start();
24 new DemoThread("windows2").start();
25 }
26 }
27 }
28 }

方法二:实现Runnable接口创建线程类
Ø 定义Runnable接口的实现类,并重写该接口的run方法(该方法是该线程的线程执行体)
Ø 创建Runnable实现类的实例,并以此实例作为Thread的target来创建Tread对象

1 public class DemoThread implements Runnable
2 {
3 private int i;
4 public void run()
5 {
6 for(;i<100;i++)
7 System.out.println(Thread.currentThread().getName()+"-------"+i);
8
9 }
10 public static void main(String[] args)
11 {
12 for(int i=0;i<100;i++)
13 {
14 System.out.println(Thread.currentThread().getName()+"-----------"+i);
15
16 if(i==20)
17 {
18 DemoThread t=new DemoThread();
19 new Thread(t,"Windows1").start();
20 new Thread(t,"Windows2").start();
21 }
22 }
23 }
24 }

两种方法比较:
- 采用实现Runnable接口方式的线程还可以继承其他类,而继承Tread类后不能再继承其他父类。
- 实现Runnable接口方式的线程可以共享一个target对象,适合多个相同线程来处理同一份资源的情况
- 若需要访问当前线程,实现Runnable接口方式只能使用Thread.currentThread()方法,而继承Thread可直接使用this即获取当前线程。
3、线程的生命周期
新建:使用关键字new创建一个线程后,处于新建状态,此时仅由虚拟机为其分配内存并初始化成员变量,程序不会执行线程执行体。
4、线程的控制
5、线程的同步
当两个或多个线程需要访问同一共享资源时,需要某种方式来确保资源在某一时刻只被一个线程使用,这个方式称为“同步“。
为了解决同步问题,java引入同步监视器,代码块格式如下:
synchronized (obj)
{
}
Java还使用Synchronized关键字来修饰某个方法,此方法就无需显示指定同步监视器。
同步锁:它具有与使用 synchronized 方法和语句所访问的隐式监视器锁相同的一些基本行为和语义,但功能更强大。 使用Lock对象的代码格式如下:

1 public class X
2 {
3 private final ReentrantLock lock=new ReentrantLock();
4 public void m()
5 {
6 lock.lock();//加锁
7 try
8 {
9 //需要保证线程安全的代码
10 }
11 finally
12 {
13 lock.unlock();//释放锁
14 }
15 }
16 }
17
6、线程的通信
wait():告诉调用线程放弃监控器进入等待模式直到其他线程进入同一监控器并调用notify()方法。
7、线程池
- 调用Executors类的静态工厂方法创建一个ExecutorService对象,该对象代表一个线程池。
- 创建Runnable实现类或Callable实现类的实例,作为线程执行任务。
- 调用ExecutorService对象的submit方法提交Runnable实例或Callable实例。
- 当不想提交任何任务时调用ExecutorService对象的shutdown方法来关闭线程池。

1 class TestThread implements Runnable
2 {
3 public void run()
4 {
5 for(int i=0;i<50;i++)
6 {
7 System.out.println(Thread.currentThread().getName()+"---"+i);
8 }
9 }
10 }
11 public class TestMain
12 {
13
14 public static void main(String[] args)
15 {
16 // TODO 自动生成的方法存根
17 TestThread t=new TestThread();
18 ExecutorService pool=Executors.newFixedThreadPool(6);
19 pool.submit(new Thread(t));
20 pool.submit(new Thread(t));
21 pool.shutdown();
22 }
23
24 }

执行结果:
Java中的多线程总结(转)的更多相关文章
- Java 中传统多线程
目录 Java 中传统多线程 线程初识 线程的概念 实现线程 线程的生命周期 常用API 线程同步 多线程共享数据的问题 线程同步及实现机制 线程间通讯 线程间通讯模型 线程中通讯的实现 @(目录) ...
- Java中使用多线程、curl及代理IP模拟post提交和get访问
Java中使用多线程.curl及代理IP模拟post提交和get访问 菜鸟,多线程好玩就写着玩,大神可以路过指教,小弟在这受教,谢谢! 更多分享请关注微信公众号:lvxing1788 ~~~~~~ 分 ...
- 【转】Java中的多线程学习大总结
多线程作为Java中很重要的一个知识点,在此还是有必要总结一下的. 一.线程的生命周期及五种基本状态 关于Java中线程的生命周期,首先看一下下面这张较为经典的图: 上图中基本上囊括了Java中多线程 ...
- Java中的 多线程编程
Java 中的多线程编程 一.多线程的优缺点 多线程的优点: 1)资源利用率更好2)程序设计在某些情况下更简单3)程序响应更快 多线程的代价: 1)设计更复杂虽然有一些多线程应用程序比单线程的应用程序 ...
- java中的多线程 // 基础
java 中的多线程 简介 进程 : 指正在运行的程序,并具有一定的独立能力,即 当硬盘中的程序进入到内存中运行时,就变成了一个进程 线程 : 是进程中的一个执行单元,负责当前程序的执行.线程就是CP ...
- Java中的多线程=你只要看这一篇就够了
如果对什么是线程.什么是进程仍存有疑惑,请先Google之,因为这两个概念不在本文的范围之内. 用多线程只有一个目的,那就是更好的利用cpu的资源,因为所有的多线程代码都可以用单线程来实现.说这个话其 ...
- Android学习记录(5)—在java中学习多线程下载之断点续传②
在上一节中我们学习了在java中学习多线程下载的基本原理和基本用法,我们并没有讲多线程的断点续传,那么这一节我们就接着上一节来讲断点续传,断点续传的重要性不言而喻,可以不用重复下载,也可以节省时间,实 ...
- Java中使用多线程、curl及代理IP模拟post提交和get訪问
Java中使用多线程.curl及代理IP模拟post提交和get訪问 菜鸟,多线程好玩就写着玩.大神能够路过不吝赐教.小弟在这受教.谢谢! 很多其它分享请关注微信公众号:lvxing1788 ~~~~ ...
- Java中的多线程技术全面详解
本文主要从整体上介绍Java中的多线程技术,对于一些重要的基础概念会进行相对详细的介绍,若有叙述不清晰或是不正确的地方,希望大家指出,谢谢大家:) 为什么使用多线程 并发与并行 我们知道,在单核机器上 ...
- 详细分析 Java 中实现多线程的方法有几种?(从本质上出发)
详细分析 Java 中实现多线程的方法有几种?(从本质上出发) 正确的说法(从本质上出发) 实现多线程的官方正确方法: 2 种. Oracle 官网的文档说明 方法小结 方法一: 实现 Runnabl ...
随机推荐
- Nunit中文文档
NUnit中文文档:http://www.36sign.com/nunit 关于特性的使用:http://www.36sign.com/nunit/attributes.html
- ※C++随笔※=>☆C++基础☆=>※№→C++中 #include<>与#include""
#include<> 使用尖括号表示在包含文件目录中去查找(包含目录是由用户在设置环境时设置的),而不在源文件目录去查找: #include"" 使用双引号则表示首先在 ...
- Note | Javascript权威指南[第六版] 第1章:Javascript概述
JavaScript是一门高端的.动态的.弱类型的编程语言,非常适合面向对象和函数式的编程风格.JavaScript的语法源自Java,它的一等函数(first-class function)来 ...
- FreeCodeCamp 的 Basic Algorithm Scripting 题解(1)
这是本人的原创文章,转载请注明原文链接http://www.cnblogs.com/wusuowiaaa1blog/p/5932121.html. 1.Reverse a String 翻转字符串 先 ...
- 好用的log
Log.getStackTraceString(new Throwable())
- MVVM之View和ViewModel的关联
概要: 将所有的VM在加载到Application的Static Resource中,然后在View中用标签指定. 实现: 1)采用特性指定要添加到StaticResource中的对象 public ...
- PHP中的function函数详解
PHP函数,在PHP中函数起到一个不可分割的重要部分,很多功能实现都要用到函数,PHP的最大的威力就来源于函数! 在PHP中内建函数至少有上千个函数.这些内建函数了解就行了,官方文档里面有函数大全:传 ...
- Hex编码 十六进制编码
import java.io.UnsupportedEncodingException; import java.net.URLEncoder; /** * HEX字符串与字节码(字符串)转换工具 ...
- plsql 显式游标
显式游标的处理过程包括: 声明游标,打开游标,检索游标,关闭游标. 声明游标 CURSOR c_cursor_name IS statement; 游标相当于一个查询结果集,将查询的结果放在游标里,方 ...
- 2016年11月2日——jQuery源码学习笔记
1.jQuery()函数,即$().有四种不同的调用方式. (1)传递CSS选择器(字符串)给$()方法,返回当前文档中匹配该选择器的元素集.可选第二个参数,一个元素或jQuery对象,定义元素查询的 ...