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 ...
随机推荐
- python 写的http后台弱口令爆破工具
今天来弄一个后台破解的Python小程序,哈哈,直接上代码吧,都有注释~~ 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 ...
- Javascript触屏手势库-JTouch(更新V1.1)
作者:痞子|时间:2013-05-21|分类目录:js,javascript,jquery教程|Tag标签: javascript.jTouch|阅读(857) 7 条评论 Javascript触屏手 ...
- C#邮件接收系统核心代码(接收POP3邮件IMAP邮件)
/* * Created by SharpDevelop. * User: Administrator * Date: 2013/11/18 * Time: 20:55 * * To change t ...
- JSP-注释,脚本元素,指令
jsp中的注释 jsp隐藏注释 完全对客户机隐藏,不会将注释内容发送给客户机. 其语法格式为:<%-- comment --%> comment为要添加的文本注释内容. HTML注释 不完 ...
- Android(java)学习笔记197:常用的对话框
一.常见对话框属性: 1. AlertDialog.Builder属性 • setTitle: 为对话框设置标题 :• setIcon : 为对话框设置图标:• setMessage: 为对话框设置 ...
- css 权威指南笔记( 五)结构和层叠
特殊性 重要性 !important; 继承 向上传播例外,应用到body元素的背景样式可以传递到html元素,相应对的可以定义其画布. 大多数框模型属性(包括外边距.内边距.背景.边框)都不能继承 ...
- iOS UIKit:viewController之层次结构(1)
ViewController是iOS应用程序中重要的部分,是应用程序数据和视图之间的重要桥梁.且应用程序至少有一个view controller.每个view controller对象都负责和管理一个 ...
- titlebar和actionbar上的按钮设置
---恢复内容开始--- Actionbar加按钮: 在res文件夹下新建menu文件夹(如果你没有),然后添加一个XML文件 <?xml version="1.0" enc ...
- ASP.NET Boilerplate 工作单元
从上往下说起,框架使用castle拦截器,拦截实现了IApplication.IRepository接口的所有方法,和使用了UnitOfWork 特性的方法,代码如下 internal class U ...
- js实现图片自动切换效果。
js实现图片自动切换效果,简单实用,原谅我只是一只小菜鸟还在学大神天天写博文装逼. <script language="javascript"> setInterval ...