黑马程序员_线程
来源:互联网 发布:高中算法初步程序语言 编辑:程序博客网 时间:2024/05/16 10:26
------- android培训、java培训、期待与您交流! --------
线程
进程:通常将正在运行的程序称为进程。
线程:可以将进程内部的任务称为线程。
线程是进程中的实体,一个进程可以拥有多个线程。
多进程:指在操作系统中可以同时运行多个任务(程序)。
多线程:是指在同一应用程序中,同时存在几个执行体,按几条不同的执行路线共同工作的情况。线程弊端:线程太多回收效率低
线程好处:解决了多部分同时运行的问题。
创建线程的目的:未来开启一条执行路径,去执行指定的代码和其他代码实现同时运行,jvm创建的线程都定义在主函数中,而自定义的线程通过thread类种的run()方法。
方式一:定义一个类继承thread类,覆盖run()方法。
步骤:
1)定义一个继承thread类
2)覆盖thread类中的run()方法
3)直接创建thread类的子类。
4)调用strsrt方法并调用线程的任务。
5)可以使用getName()方法获取线程的名称。
方式二:实现Runnable接口
步骤1)覆盖就接口中的run方法将线程的任务代码封装到run 方法中
1) 通过Thread创建线程对象
2) 调用线程对象的Start方法开启线程。
Thread类中的主要的方法包括:
start()方法:此方法用于启动线程;
run()方法:此方法为线程的主体方法,可以根据需要重写run()方法。此线程完成什么功能,主要运用run()方法中的代码去实现。
线程的优先级
在Java语言中,线程有执行的优先级别,优先级的范围是1~10,默认值为5,可以使用Thread类中setPriority()方法来设定线程的优先级,但必须是在1~10的范围内,否则会出现异常。
优先权较高的线程会被提前执行,当它执行完毕才会轮到优先权较低的线程执行。如果优先权相同,那么采用轮流执行的方式
线程安全问题产生的原因
1)多个线程在操作共享数据
2)操作共享数据的线程有多条
3)当一个线程在执行操作共享数据的多条代码过程中,其他线程参与了运算,就会产生线程安全问题得产生。
解决方案:将多条操作共享数据的线程代码封装起来,当有线程在执行这些代码时,其他线程是不可以参与运算的,必须要当前线程把这些代码都执行完后,其他线程才可以参与运算。
在java中用同步代码块解决这个问题
Synchronized(对象)
{
需要同步的代码}
同步好处:解决了线程安问题
同步的弊端:相对效率降低了 ,因为同步外的线程都会判断同步线程锁
同步的前提: 必须有多个线程并使用同一个锁。
Java 中多线程同步是什么
在多线程程序下同步能控制对共享资源的访问。如果没有同步当一个 Java 线程在修改一个共享变量时另外一个线程正在使用或者更新同一个变量这样容易导致程序出现错误的结果。 1.解释实现多线程的几种方法? 一 Java 线程可以实现 Runnable 接口或者继承 Thread 类来实现当你打算多重继承时优先选择实现 Runnable。 2.Thread.start ()与 Thread.run ()有什么区别 Thread.start ()方法(native)启动线程使之进入就绪状态当 cpu 分配时间该线程时由 JVM 调度执行 run ()方法。
.什么时候抛出InvalidMonitorStateException 异常为什么
调用 wait ()/notify ()/notifyAll ()中的任何一个方法时如果当前线程没有获得该对象的锁那么就会抛出 IllegalMonitorStateException的异常(也就是说程序在没有执行对象的任何同步块或者同步方法时仍然尝试调用 wait ()/notify()/notifyAll ()时)。由于该异常是 RuntimeExcpetion 的子类所以该异常不一定要捕获(尽管你可以捕获只要你愿意).作为 RuntimeException此类异常不会在 wait (),notify(),notifyAll ()的方法签名提及
.在静态方法上使用同步时会发生什么事
同步静态方法时会获取该类的“Class”对象所以当一个线程进入同步的静态方法中时线程监视器获取类本身的对象锁其它线程不能进入这个类的任何静态同步方法。它不像实例方法因为多个线程可以同时访问不同实例同步实例方法。
注意:同步函数的锁是this
同步函数与同步代码块区别
同步函数用的锁是this
同步代码块的锁是任意对象
静态同步函数中用的锁一定不是this.,他使用的锁就是该函数所属字节码文件对象,可以用getclass方法获取也可以用当前类名.Class表示
线程通信: 多个线程在处理同一个资源,但是任务不同
等待/唤醒机制:wait()让线程处于冻结状态,被wait的的线程会被·储存在线程池中
Notify()唤醒线程池中任意线程
Notifyall():唤醒线程池中的所有线程。
注意:这些方法必须都定义在同步中,因为这些方法是用于操作线程状态的方法,必须明确到底操作的是那个锁上的线程。
为什么操作线程的方法定义在了object类中,
因为这些方法是监视器的方法,监视器就是锁
所可以是任意对象,任意的对象调用的的方式一定定义在object类中。
Sleep和wait方法的区别:
1)Wait:可以制定时间也可以不指定,sleep必须指定时间
2)在同步中对、cpu的执行权和锁的处理不同
Wait释放执行权,释放锁
Sleep:释放执行权,不释放锁
怎么控制线程任务结束:任务中都会有循环结构,只要控制循环就可以结束任务
控制循环通常用定义标记来完成。
如果线程处于了冻结状态,就无法读取标记。
可以使用interrupt方法,可以使线程从冻结状态强制恢复到运行状态中,让线程具备cpu的执行资格,当强制是会发生中断异常,记得处理。
线程的控制
线程的控制包括线程的启动、挂起、状态检查以及如何正确结束线程,由于在程序中使用多线程,为合理安排线程的执行顺序,可以对线程进行相应的控制。
线程的启动
一个新的线程被创建后处于初始状态,即就绪状态,当轮到这个线程执行时(获得CPU),进入“运行”状态,开始执行线程run()方法中的代码。
调用start()方法启动线程,运行run()方法。程序继续执行start()方法下面的语句,这时run()方法可能还在运行,这样,就实现了多任务操作。
2 线程的挂起
线程的挂起操作实质上就是使线程进入“阻塞” (“非可执行”)状态,在这个状态下,CPU不会分给线程时间段,进入这个状态可以用来暂停一个线程的运行,在线程挂起后,可以通过重新唤醒线程来使之恢复运行。
引起线程挂起的原因:
(1)通过调用sleep()方法使线程进入休眠状态,线程在指定时间内不会运行。
例如:想让线程休眠1.5秒钟,即1 500毫秒,可以使用如下代码。
try { Thread.sleep(1500); // 使线程休眠1500毫秒
} catch (InterruptedException e) { }
引起线程挂起的原因
(2)通过调用join()方法使线程挂起。如果存在两个线程A和B,想让线程B挂起,线程A执行结束后再执行B,线程A可调用join()方法。
public Thread3 extends Thread{
……
Thread3 A=new Thread3();
Thread3 B=new Thread3();
A.start();
try{
A.join(); }catch( Exception e){}
B.start();
}
(3)通过调用wait()方法使线程挂起,直到线程得到了notify()和notifyAll()消息,线程才会进入“可执行”状态。例如:
thread.wait(1000);//让线程挂起1秒
thread.notify(); //唤醒线程
(4)线程在等待某个输入/输出完成。
线程状态检查
isAlive()方法用于测试线程是否处于活动状态。如果线程已经启动且尚未终止,则为活动状态。
语法格式为:
thread.isAlive();
thread:这是一个线程对象,isAlive()方法将判断该线程的活动状态。
结束线程
结束线程有两种情况:
(1)自然消亡:一个线程从run()方法的结尾处返回,自然消亡且不能再被运行;
(2)强制死亡:调用Thread类中stop()方法强制停止,不过该方法已经被废弃。
后台线程
后台线程,即Daemon线程,它是一个在后台执行服务的线程。
例如操作系统中的隐藏线程和Java语言中的垃圾自动回收线程等。如果所有的非后台线程都结束了,则后台线程也会自动终止。
--------- android培训、java培训、期待与您交流! ----------
- 黑马程序员_线程
- 黑马程序员_线程
- 黑马程序员_线程
- 黑马程序员_线程
- 黑马程序员_线程
- 黑马程序员_线程
- 黑马程序员_线程
- 黑马程序员_线程
- 黑马程序员_线程
- 黑马程序员_线程
- 黑马程序员_线程
- 黑马程序员_线程
- 黑马程序员_线程总结
- 黑马程序员_线程死锁
- 黑马程序员_线程基础
- 黑马程序员_线程总结
- 黑马程序员_<<线程,Thread>>
- 黑马程序员_线程小结
- java 自学日志 【十六】---网络编程
- PHP扩展开发与内核应用阅读笔记---php的内存管理
- 关于winrar4.20注册码问题
- 黑马程序员_网络编程
- 你是狗吗?
- 黑马程序员_线程
- java.net.ConnectException: localhost/127.0.0.1:8080 - Connection refused
- JUnit的jar包和hamcrest的jar包关系
- 黑马程序员_异常
- MongoDB的初学三:MongoDB的基本命令
- Eclipse快捷键 10个最有用的快捷键
- c中显示汉字
- VirtualBox安装error错误代码3解决方法
- 黑马程序员_注解