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 ...
随机推荐
- 深入理解C#:编程技巧总结(一)
原创文章,转载请注明出处! 以下总结参阅了:MSDN文档.<C#高级编程>.<C#本质论>.前辈们的博客等资料,如有不正确的地方,请帮忙及时指出!以免误导! 1.实现多态性的两 ...
- Activity透明/半透明效果的设置transparent(两种实现方法)
两种方法实现Activity透明/半透明效果的设置,代码思路很有调理,感兴趣的朋友可以参考下,希望本文可以帮助到你 方法一:res/values文件夹下建立styles.xml: 复制代码代码如下 ...
- rsyslog官方文档
http://www.rsyslog.com/doc/v8-stable/configuration/index.html
- Qt 学习之路:元素布局
上一章我们介绍了 QML 中用于定位的几种元素,被称为定位器.除了定位器,QML 还提供了另外一种用于布局的机制.我们将这种机制成为锚点(anchor).锚点允许我们灵活地设置两个元素的相对位置.它使 ...
- RHEL7安装配置TigerVNC
TigerVNC使用非加密的链接,默认会被firewalld blocked 掉,想要 vnc正常工作就需要让firewalld开放相应的端口才行. vnc默认的端口号为5900,而每个vnc win ...
- 9.23 noip模拟试题
Problem 1 抓牛(catchcow.cpp/c/pas) [题目描述] 农夫约翰被通知,他的一只奶牛逃逸了!所以他决定,马上出发,尽快把那只奶牛抓回来. 他们都站在数轴上.约翰在N(O≤N ...
- postgresql sql修改表,表字段
1.更改表名 alter table 表名 rename to 新表名 2.更改字段名 alter table 表名 rename 字段名 to 新字段名 3.增加列 ALTER TABLE ud_w ...
- php函数serialize()与unserialize()
serialize()和unserialize()在php手册上的解释是: serialize — Generates a storable representation of a value ser ...
- iOS NSData简单解析
iOS 基本数据类型之NSData 1 nsdata 作用: 用于存储二进制的数据类型 nadat类提供一种简单的方式,它用来设置缓存区.将文件的内容读入到缓存区.或者将缓存区中的内容写到一个文件. ...
- 内联式css样式,直接写在现有的HTML标签中
CSS样式可以写在哪些地方呢?从CSS 样式代码插入的形式来看基本可以分为以下3种:内联式.嵌入式和外部式三种.这一小节先来讲解内联式. 内联式css样式表就是把css代码直接写在现有的HTML标签中 ...