96SEO 2026-02-20 05:00 0
线程基础线程简介什么是进程什么是线程进程和线程的区别创建线程ThreadRunnableCallable、Future、FutureTaskCallableFutureFutureTaskCallable

示例线程基本用法线程休眠线程礼让终止线程守护线程线程通信wait/notify/notifyAlljoin管道线程生命周期线程常见问题sleep、yield、join
关键词Thread、Runnable、Callable、Future、wait、notify、notifyAll、join、sleep、yeild、线程状态、线程通信
简言之进程可视为一个正在运行的程序。
它是系统运行程序的基本单位因此进程是动态的。
进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动。
进程是操作系统进行资源分配的基本单位。
线程是操作系统进行调度的基本单位。
线程也叫轻量级进程Light
Process在一个进程里可以创建多个线程这些线程都拥有各自的计数器、堆栈和局部变量等属性并且能够访问共享的内存变量。
一个程序至少有一个进程一个进程至少有一个线程。
线程比进程划分更细所以执行开销更小并发性更高。
进程是一个实体拥有独立的资源而同一个进程中的多个线程共享进程的资源。
调用线程主体tA.start();tB.start();}static
{System.out.println(Thread.currentThread().getName()
不支持多重继承所有的类都只允许继承一个父类但可以实现多个接口。
如果继承了
类就无法继承其它类这不利于扩展。
类可能只要求可执行就行继承整个
调用线程主体tA.start();tB.start();}static
{System.out.println(Thread.currentThread().getName()
张票);ticket--;}}}}Callable、Future、FutureTask
接口这两种创建线程的方式都没有返回值。
所以线程执行完后无法得到执行结果。
但如果期望得到执行结果该怎么做
任务的执行结果进行取消、查询是否完成、获取结果。
必要时可以通过
{System.out.println(Thread.currentThread().getName()
方法描述run线程的执行实体。
start线程的启动方法。
currentThread返回对当前正在执行的线程对象的引用。
setName设置线程名称。
getName获取线程名称。
setPriority设置线程优先级。
Java
[1,10]一般来说高优先级的线程在运行时会具有优先权。
可以通过
thread.setPriority(Thread.MAX_PRIORITY)
5。
getPriority获取线程优先级。
setDaemon设置线程为守护线程。
isDaemon判断线程是否为守护线程。
isAlive判断线程是否启动。
interrupt中断另一个线程的运行状态。
interrupted测试当前线程是否已被中断。
通过此方法可以清除线程的中断状态。
换句话说如果要连续调用此方法两次则第二次调用将返回
false除非当前线程在第一次调用清除其中断状态之后且在第二次调用检查其状态之前再次中断。
join可以使一个线程强制运行线程强制运行期间其他线程无法运行必须等待此线程完成之后才可以继续执行。
Thread.sleep静态方法。
将当前正在执行的线程休眠。
Thread.yield静态方法。
将当前正在执行的线程暂停让其他线程执行。
InterruptedException因为异常不能跨线程传播回
中因此必须在本地进行处理。
线程中抛出的其它异常也同样需要在本地进行处理。
休眠指定的时间Thread.sleep(this.time);}
{e.printStackTrace();}System.out.println(this.name
方法的调用声明了当前线程已经完成了生命周期中最重要的部分可以切换给其它线程来执行
该方法只是对线程调度器的一个建议而且也只是建议具有相同优先级的其它线程可以运行。
{e.printStackTrace();}System.out.println(Thread.currentThread().getName()
{System.out.print(线程礼让);Thread.yield();}}}}
如果先前由这些监视器保护的任何对象处于不一致状态则损坏的对象将对其他线程可见从而可能导致任意行为。
方法这两个方法同样也都不建议使用了所以这里也就不多介绍了。
Thread.stop
的许多用法应由仅修改某些变量以指示目标线程应停止运行的代码代替。
目标线程应定期检查此变量如果该变量指示要停止运行则应按有序方式从其运行方法返回。
如果目标线程等待很长时间例如在条件变量上则应使用中断方法来中断等待。
{System.out.println(3、main线程休眠被终止);}t.interrupt();
{System.out.println(1、进入run()方法);try
线程休眠10秒System.out.println(2、已经完成了休眠);}
{System.out.println(3、MyThread线程休眠被终止);return;
返回调用处}System.out.println(4、run()方法正常结束);}}
MyTask);thread.start();TimeUnit.MILLISECONDS.sleep(50);task.cancel();}private
{System.out.println(Thread.currentThread().getName()
{System.out.println(count);}System.out.println(Thread.currentThread().getName()
MyTask);thread.start();TimeUnit.MILLISECONDS.sleep(50);thread.interrupt();}private
{System.out.println(Thread.currentThread().getName()
{System.out.println(count);}System.out.println(Thread.currentThread().getName()
终止的线程。
当所有非守护线程结束时程序也就终止同时会杀死所有守护线程。
与守护线程Daemon
守护线程的优先级比较低用于为系统中的其它对象和线程提供服务。
典型的应用就是垃圾回收器。
异常一个守护线程创建的子线程依然是守护线程。
不要认为所有的应用都可以分配给守护线程来进行服务比如读写操作或者计算逻辑。
{System.out.println(Thread.currentThread().getName()
当多个线程可以一起工作去解决某个问题时如果某些部分必须在其它部分之前完成那么就需要对线程进行协调。
会自动释放当前线程占有的对象锁并请求操作系统挂起当前线程让线程从
来唤醒。
如果没有释放锁那么其它线程就无法进入对象的同步方法或者同步控制块中那么就无法执行
由于每个对象都拥有对象锁让当前线程等待某个对象锁自然应该基于这个对象Object来操作而非使用当前线程Thread来操作。
因为当前线程可能会等待多个线程的锁如果基于线程Thread来操作就非常复杂了。
PriorityQueue(QUEUE_SIZE);public
{System.out.println(队列空等待数据);queue.wait();}
{e.printStackTrace();queue.notifyAll();}}queue.poll();
{e.printStackTrace();}System.out.println(Thread.currentThread().getName()
{System.out.println(队列满等待有空余空间);queue.wait();}
{e.printStackTrace();queue.notifyAll();}}queue.offer(1);
{e.printStackTrace();}System.out.println(Thread.currentThread().getName()
方法让一个线程强制运行线程强制运行期间其他线程无法运行必须等待此线程完成之后才可以继续执行。
{e.printStackTrace();}}System.out.println(Main
{System.out.println(Thread.currentThread().getName()
管道输入/输出流和普通的文件输入/输出流或者网络输入/输出流不同之处在于它主要用于线程之间的数据传输而传输的媒介为内存。
种具体实现PipedOutputStream、PipedInputStream、PipedReader
将输出流和输入流进行连接否则在使用时会抛出IOExceptionout.connect(in);Thread
PrintThread);printThread.start();int
中运行。
但是在操作系统层面它可能处于运行状态也可能等待资源调度例如处理器资源资源调度完成就进入运行状态。
所以该状态的可运行是指可以被运行具体有没有运行要看底层操作系统的资源调度。
修饰的方法、代码块同一时刻只允许一个线程执行其他线程只能等待即处于阻塞状态。
当占用
并发包中的锁都是基于它实现的LockSupport.unpark
此状态意味着无需等待其它线程显式地唤醒在一定时间之后会被系统自动唤醒。
被调用的线程执行完毕LockSupport.parkNanos
方法LockSupport.unparkLockSupport.parkUntil
状态的线程上执行这两个方法是没有意义的。
这就是为什么这些方法是静态的。
它们可以在当前正在执行的线程中工作并避免程序员错误的认为可以在其他非运行线程调用这些方法。
原因在于线程优先级依赖于操作系统的支持然而不同的操作系统支持的线程优先级并不相同不能很好的和
IllegalThreadStateException这是一种运行时异常多次调用
方法它的行为就会和普通的方法一样。
为了在新的线程中执行我们的代码必须使用
进程和线程关系及区别sleep()wait()yield()和
并发编程线程间协作的两种方式wait、notify、notifyAll
作为专业的SEO优化服务提供商,我们致力于通过科学、系统的搜索引擎优化策略,帮助企业在百度、Google等搜索引擎中获得更高的排名和流量。我们的服务涵盖网站结构优化、内容优化、技术SEO和链接建设等多个维度。
| 服务项目 | 基础套餐 | 标准套餐 | 高级定制 |
|---|---|---|---|
| 关键词优化数量 | 10-20个核心词 | 30-50个核心词+长尾词 | 80-150个全方位覆盖 |
| 内容优化 | 基础页面优化 | 全站内容优化+每月5篇原创 | 个性化内容策略+每月15篇原创 |
| 技术SEO | 基本技术检查 | 全面技术优化+移动适配 | 深度技术重构+性能优化 |
| 外链建设 | 每月5-10条 | 每月20-30条高质量外链 | 每月50+条多渠道外链 |
| 数据报告 | 月度基础报告 | 双周详细报告+分析 | 每周深度报告+策略调整 |
| 效果保障 | 3-6个月见效 | 2-4个月见效 | 1-3个月快速见效 |
我们的SEO优化服务遵循科学严谨的流程,确保每一步都基于数据分析和行业最佳实践:
全面检测网站技术问题、内容质量、竞争对手情况,制定个性化优化方案。
基于用户搜索意图和商业目标,制定全面的关键词矩阵和布局策略。
解决网站技术问题,优化网站结构,提升页面速度和移动端体验。
创作高质量原创内容,优化现有页面,建立内容更新机制。
获取高质量外部链接,建立品牌在线影响力,提升网站权威度。
持续监控排名、流量和转化数据,根据效果调整优化策略。
基于我们服务的客户数据统计,平均优化效果如下:
我们坚信,真正的SEO优化不仅仅是追求排名,而是通过提供优质内容、优化用户体验、建立网站权威,最终实现可持续的业务增长。我们的目标是与客户建立长期合作关系,共同成长。
Demand feedback