黑马程序员_java 多线程(1)
2013-06-12 12:00
134 查看
---------------------- <a href="http://edu.csdn.net"target="blank">ASP.Net+Android+IO开发S</a>、<a href="http://edu.csdn.net"target="blank">.Net培训</a>、期待与您交流!
----------------------
1.概述
进程:是一个正在执行的程序,每一个进程的执行都有一个执行顺序,该顺序是一个执行路径,或叫一个控制单元。
线程:就是进程中的一个独立的控制单元;线程在控制着进程的执行,一个进程至少有一个线程。
java启动是就会有一个进程java.exe执行,该进程中至少有一个线程负责java程序的执行,而且这个线程运行的代码存放于main方法中。
2.创建线程的方式
方式一:(1)定义类继承Thread;
(2)覆盖Thread中的run方法,目的是将自定义的代码存储在run方法中,让线程运行。
(3)调用线程的strat方法;该方法的作用:启动线程,调用run方法。
public
class Test {
publicstatic
void main(String[]args) {
Demo demo=new Demo();//创建一个线程
demo.start();//开启线程并执行线程的run方法
}
}
class Demo
extends Thread
{
public
void run()
{
}
}
调用start方法而不调用run方法:调用run方法仅仅是对象调用方法,而线程创建了去并没有运行。
方式二:(1)定义类实现Runnable接口;
(2)覆盖Runnable接口中的run方法;目的:存储线程要运行的代码
(3)通过Thread类建立线程对象;
(4)将Runnable接口的子类对象作为实际参数传递给Thread类的构造函数;
因为自定义的run方法所属的对象是Runnable接口的子类对象,所以让要让多线程去执行指定对象的run方法;
(5)调用Thread类的start方法开启线程。
public
class Test {
publicstatic
void main(String[]args) {
Demo demo=new Demo();
Thread th=new Thread(demo);//创建线程
Thread th1=new Thread(demo);//创建线程
th.start();
th1.start();
}
}
class Demo
implements Runnable
{
publicvoid run()
{
}
}
创建线程两种方式的利弊:
实现的好处:避免了单继承的局限性
区别:
继承Thread:线程代码存放在Thread子类的run方法中
实现Runnable:线程的代码存放在接口子类的run方法中
3.多线程的特性:随机性
多线程运行后结果会不同,因为在某一时刻cpu只能执行一个程序。所以多个线程执行时,这些线程都会获取cpu的执行权,cpu执行到谁,谁就会运行。
4.多线程的运行状态
![](https://img-blog.csdn.net/20130612133006484)
5.获取多线程对象及名称
线程都有自己默认的名称 Thread-编号 该编号是从0开始的
static Thread CurrentThread(): 获取当前线程兑现
getName(): 获取线程名称
6.多线程的安全问题
问题的原因:当多条语句在操作同一个线程的共享数据时,一个线程对多条语句只执行了一部分,还没执行完,另
一个线程参与进来,导致共享数据的错误。
解决办法:对多条操作共享数据的语句,只能让一个线程都执行完,在执行过程中,其他线程不可参与执行
解决方式一:同步代码块
synchronized(对象)
{
需要被同步的代码(明确多线程运行代码;明确共享数据;明确哪些语句是操作共享数据的)
}
同步的经典举例-----火车卫生间
解释:对象如同锁,持有锁的对象才能在同步中执行,没有锁定的对象即使有获取执行权,也不能在同步中执行
同步的前提:1.必须要有两个或者两个以上的线程 2.必须是多个线程使用同一个锁
同步的利弊:
利:解决了多线程的安全问题
弊:多个线程需要判断锁,较为消耗资源。
方式二:同步函数
函数需要被对象调用,那么函数都有一个所属对象引用this,所以同步函数使用的锁是this。
class Demo
{
public
synchronized void method()
{
//操作共享数据的语句
}
}
静态同步函数:静态同步函数的锁是:类名.class、
因为静态方法中不能定义this,但是静态进内存时,内存中没有本类对象,但一定有该类对应的字节码文件对象,该对象的类型是Class。所以静态的同步方法,使用的锁是该方法所在类的字节码文件对象即:类
99d1
名.class
---------------------- <a href="http://edu.csdn.net"target="blank">ASP.Net+Android+IOS开发</a>、<a href="http://edu.csdn.net"target="blank">.Net培训</a>、期待与您交流!
----------------------
----------------------
1.概述
进程:是一个正在执行的程序,每一个进程的执行都有一个执行顺序,该顺序是一个执行路径,或叫一个控制单元。
线程:就是进程中的一个独立的控制单元;线程在控制着进程的执行,一个进程至少有一个线程。
java启动是就会有一个进程java.exe执行,该进程中至少有一个线程负责java程序的执行,而且这个线程运行的代码存放于main方法中。
2.创建线程的方式
方式一:(1)定义类继承Thread;
(2)覆盖Thread中的run方法,目的是将自定义的代码存储在run方法中,让线程运行。
(3)调用线程的strat方法;该方法的作用:启动线程,调用run方法。
public
class Test {
publicstatic
void main(String[]args) {
Demo demo=new Demo();//创建一个线程
demo.start();//开启线程并执行线程的run方法
}
}
class Demo
extends Thread
{
public
void run()
{
}
}
调用start方法而不调用run方法:调用run方法仅仅是对象调用方法,而线程创建了去并没有运行。
方式二:(1)定义类实现Runnable接口;
(2)覆盖Runnable接口中的run方法;目的:存储线程要运行的代码
(3)通过Thread类建立线程对象;
(4)将Runnable接口的子类对象作为实际参数传递给Thread类的构造函数;
因为自定义的run方法所属的对象是Runnable接口的子类对象,所以让要让多线程去执行指定对象的run方法;
(5)调用Thread类的start方法开启线程。
public
class Test {
publicstatic
void main(String[]args) {
Demo demo=new Demo();
Thread th=new Thread(demo);//创建线程
Thread th1=new Thread(demo);//创建线程
th.start();
th1.start();
}
}
class Demo
implements Runnable
{
publicvoid run()
{
}
}
创建线程两种方式的利弊:
实现的好处:避免了单继承的局限性
区别:
继承Thread:线程代码存放在Thread子类的run方法中
实现Runnable:线程的代码存放在接口子类的run方法中
3.多线程的特性:随机性
多线程运行后结果会不同,因为在某一时刻cpu只能执行一个程序。所以多个线程执行时,这些线程都会获取cpu的执行权,cpu执行到谁,谁就会运行。
4.多线程的运行状态
5.获取多线程对象及名称
线程都有自己默认的名称 Thread-编号 该编号是从0开始的
static Thread CurrentThread(): 获取当前线程兑现
getName(): 获取线程名称
6.多线程的安全问题
问题的原因:当多条语句在操作同一个线程的共享数据时,一个线程对多条语句只执行了一部分,还没执行完,另
一个线程参与进来,导致共享数据的错误。
解决办法:对多条操作共享数据的语句,只能让一个线程都执行完,在执行过程中,其他线程不可参与执行
解决方式一:同步代码块
synchronized(对象)
{
需要被同步的代码(明确多线程运行代码;明确共享数据;明确哪些语句是操作共享数据的)
}
同步的经典举例-----火车卫生间
解释:对象如同锁,持有锁的对象才能在同步中执行,没有锁定的对象即使有获取执行权,也不能在同步中执行
同步的前提:1.必须要有两个或者两个以上的线程 2.必须是多个线程使用同一个锁
同步的利弊:
利:解决了多线程的安全问题
弊:多个线程需要判断锁,较为消耗资源。
方式二:同步函数
函数需要被对象调用,那么函数都有一个所属对象引用this,所以同步函数使用的锁是this。
class Demo
{
public
synchronized void method()
{
//操作共享数据的语句
}
}
静态同步函数:静态同步函数的锁是:类名.class、
因为静态方法中不能定义this,但是静态进内存时,内存中没有本类对象,但一定有该类对应的字节码文件对象,该对象的类型是Class。所以静态的同步方法,使用的锁是该方法所在类的字节码文件对象即:类
99d1
名.class
---------------------- <a href="http://edu.csdn.net"target="blank">ASP.Net+Android+IOS开发</a>、<a href="http://edu.csdn.net"target="blank">.Net培训</a>、期待与您交流!
----------------------
相关文章推荐
- 黑马程序员-Java多线程和定时器
- 黑马程序员-Java多线程-day12
- 黑马程序员 java多线程
- 黑马程序员_JAVA多线程
- 黑马程序员.Android攻城狮.JAVA基础.1.5.Java多线程
- 黑马程序员---------Java基础------------多线程简单总结
- 黑马程序员——Java---多线程-生产者和消费者
- 黑马程序员——Java练习笔记——多线程
- 黑马程序员--------Java多线程讲解笔记
- 黑马程序员------------java多线程
- 黑马程序员——Java基础---多线程
- 黑马程序员—java多线程
- 黑马程序员—JAVA基础之多线程
- 黑马程序员-Java编程知识总结多线程
- 黑马程序员--JAVA基础复习之多线程(一)概念与创建方法
- 黑马程序员——java中的多线程
- 黑马程序员 java学习笔记——多线程2
- 黑马程序员JAVA基础-多线程
- 黑马程序员 JAVA基础 - 多线程(一)
- 黑马程序员_java基础之多线程