Java多线程---基础知识

1. 线程简介

进程:进程具有独立的执行环境。进程具有一套完整的私有基本运行时资源。每个进程都有自己的存储空间。
线程:线程有时称为轻量级进程。创建新线程所需的资源少于创建新进程的资源。
多线程:多条执行路径,主线程和子线程并行交替执行

2. 线程实现

实现Runnable接口:
提供一个Runnable对象。该 Runnable接口定义了一个方法,run用于包含在线程中执行的代码。该Runnable对象将传递给Thread构造函数。
继承Thread类:
子类Thread。在Thread类自身实现Runnable,但其run方法不起作用。应用程序可以子类Thread提供自己的实现run。

线程方法:
setPriority(int newPriority) 更改线程的优先级
static void sleep(long millis) 在指定的毫秒数内让当前正在执行的线程休眠 
void join() 等待该线程终止 
static void yield() 暂停当前正在执行的线程对象,并执行其他 线程 
void interrupt() 中断线程,别用这个方式 
boolean isAlive() 测试线程是否处于活动状态
 **线程优先级:更改线程的优先级**
 		Java提供一个线程调度器来监控程序中启动后进入就绪状态的所有线程,线程调度器按照优先级决定应该调度哪个线程来执行。
 		 线程的优先级用数字表示,范围从1~10. 
 		 Thread.MIN_PRIORITY = 1; 
 		 Thread.MAX_PRIORITY = 10; 
 		 Thread.NORM_PRIORITY = 5;
 	getPriority() . setPriority(int xxx)  获得或改变优先级,优先级的设定建议在start()调度之前。
 	
 **线程休眠:sleep方法**
 使当前线程在指定时间段内暂停执行。
 这是使处理器时间可用于应用程序的其他线程或计算机系统上可能正在运行的其他应用程序的有效方法。
 
 **线程礼让:yield方法**
 Thread类中提供了一种礼让方法,使用yield()方法表示
 它只是给当前正处于运行状态下的线程一个提醒,告知它可以将资源礼让给其他线程
 但这仅仅是一种暗示,没有任何一种机制保证当前线程会将资源礼让。
 yield()方法使具有同样优先级的线程有进入可执行状态的机会
 当当前线程放弃执行权时会再度回到就绪状态
 
 **线程联合:join方法**
 join方法允许一个线程等待另一线程的完成。如果t是Thread正在执行其线程的对象,
 t.join();
 导致当前线程暂停执行,直到t的线程终止。重载join允许程序员指定等待时间。
 但是,与一样sleep,join依赖于OS进行计时,因此不应该假定join它将完全按照您指定的时间等待。
 
 **线程停止**
 停止一个线程通常意味着在线程处理任务完成之前停掉正在做的操作,也就是放弃当前的操作。
 在 Java 中有以下 3 种方法可以终止正在运行的线程:
 使用退出标识,使得线程正常退出,即当run方法完成后进程终止。
 使用stop强行中断线程(此方法为作废过期方法),不推荐使用。
 使用interrupt方法中断线程,不推荐使用。
 
 **守护线程**
 	守护线程是一种特殊的线程,就和它的名字一样,它是系统的守护者,
 在后台默默完成一些系统性的服务,比如垃圾回收线程。
 	如果用户线程全部结束,则意味着这个程序无事可做。守护线程要守护的对象已经
 	不存在了,那么整个应用程序就结束了。

3. 线程状态(5大状态)

初始(NEW):新创建了一个线程对象,但还没有调用start()方法。
运行(RUNNABLE):Java线程中将就绪(ready)和运行中(running)两种状态笼统的称为“运行”。
阻塞(BLOCKED):表示线程阻塞于锁。
等待(WAITING):进入该状态的线程需要等待其他线程做出一些特定动作(通知或中断)。
超时等待(TIMED_WAITING):该状态不同于WAITING,它可以在指定的时间后自行返回。
终止(TERMINATED):表示该线程已经执行完毕。

4. 线程同步

线程同步:多个线程操作同一个资源
并发:同一个对象被多个线程同时操作

同步语句(synchronized statements )和同步方法(synchronized methods )
创建同步代码的一种方法是使用同步语句。与同步方法不同,同步语句必须指定提供内部锁的对象。
同步语句对于通过细粒度同步提高并发性很有用。

5. 线程死锁:

死锁是一种特定的程序状态,在实体之间,由于循环依赖导致彼此一直处于等待之中,没有任何个体可以继续前进。
死锁不仅仅在线程之间会发生,存在资源独占的进程之间同样也可能出现死锁。通常来说,我们大多是聚焦在多线程场景中的死锁,指两个或多个线程之间,由于互相持有对方需要的锁,互相等待,而永久处于阻塞状态。
死锁发生时的条件:
(1)互斥条件:一个资源每次只能被一个进程使用。
(2)请求与保持条件:一个进程因请求资源而阻塞时,对已获得的资源保持不放。
(3)不剥夺条件: 进程已获得的资源,在未使用完之前,不能强行剥夺。
(4)循环等待条件:若干进程之间形成一种头尾相接的循环等待资源关系。

6. 线程通信

两个方法解决线程之间的通信问题:
wait():表示线程一直等待,与sleep不同,会释放锁
notifyAll():唤醒同一个对象上所调用的wait()方法的线程,优先级别高的线程优先调度
1.使用缓冲区
2.使用线程池 ExecutorService 和Exectors

发布了39 篇原创文章 · 获赞 1 · 访问量 562

猜你喜欢

转载自blog.csdn.net/love_to_share/article/details/103283167