96SEO 2026-02-20 08:55 13
。

之前我们主要描述的是个⼈业务#xff0c;即⼀个⼈完全处理⾃⼰的…1.
⼀个线程就是⼀个执⾏流.每个线程之间都可以按照顺序执⾏⾃⼰的代码.多个线程之间同时执⾏
还是回到我们之前的银⾏的例⼦中。
之前我们主要描述的是个⼈业务即⼀个⼈完全处理⾃⼰的业务。
我们进⼀步设想如下场景
⼀家公司要去银⾏办理业务既要进⾏财务转账⼜要进⾏福利发放还得进⾏缴社保。
如果只有张三⼀个会计就会忙不过来耗费的时间特别⻓。
为了让业务更快的办理好张三⼜找来两位同事李四、王五⼀起来帮助他三个⼈分别负责⼀个事情(可以理解为一个进程中包含着多个线程)分别申请⼀个号码进⾏排队⾃此就有了三个执⾏流共同完成任务但本质上他们都是为了办理⼀家公司的业务。
此时我们就把这种情况称为多线程将⼀个⼤任务分解成不同⼩任务交给不同执⾏流就分别排队执⾏。
其中李四、王五都是张三叫来的所以张三⼀般被称为主线程MainThread。
单核CPU的发展遇到了瓶颈.要想提高算例,就需要多核CPU.而并发编程能更充分利用多核CPU
资源.可以把一个任务拆解为多个部分,分配给不同的CPU核心来完成.其次虽然多进程也可以实现并发编程,但是线程比进程更加轻量.
创建线程比创建进程快.销毁线程要比销毁进程快(上述两方面的原因都是因为每次创建进程都会分配系统资源,这种操作的开销比较大,而线程就可以对资源进程沿用)调度线程比调度进程快.(通过PCB中的线程调度属性来支持)
严格意义上来说,一个PCB是描述一个线程的,而进程是若干个PCB合起来描述的.
pid:每个线程都不同.(线程id)内存指针:同一进程相同,线程之间不一样.文件描述符表:同一进程相同,线程之间不一样.(由于同一进程调度的系统文件和使用的内存资源都是一样的,所以2,3一样)线程调度属性:由于它是支持线程调度的一个属性,所以很明显不同线程之间一定不一样,他是每个线程独有的属性.tgid:同一进程中的线程之间都是一样的.(进程id)
比如我们合租一间房子,客厅,卫生间,厨房等空间都是公共区域,相当于上述PCB中的内存指针和文件描述符表还有tgid,每个线程之间共享着内存空间和系统文件.每个卧室之间是每个人独有的空间,每个人的房间都不一样,就像上述的pid,线程调度属性.
进程包含线程,每个进程至少有一个进程存在,就是主线程.进程和进程之间不共享内存空间和文件资源,即它们的内存指针和文件描述符表不一样.而同一进程的线程之间共享内存空间和文件资源.进程是资源分配的基本单位(分配内存空间和文件资源),线程是执行调度的基本单位(创建线程调度属性).一个进程崩溃不会影响到其他进程,一个线程崩溃可能会影响其他进程,连同其他线程一起崩溃.
全民制作人们大家好,我是练习时长两年半的个人练习生cxk,喜欢Java,数据结构,数据库,music
由于房间中的只因实在太多了,有100只,于是便分配到两个房间来有两个坤坤吃:
但是由于在盖一间房(创建一个新的进程)的开销实在是太大了,所以我们让好多个坤坤(好多个线程)进同一个房间吃只因.(创建好多个线程),这样就会节省开销.
但是此时,有两个坤坤产生了冲突,它们在抢一只只因大腿,它们都想吃.
此时,旁边的坤坤来劝架(鸡哥算了算了),劝住了.大家继续吃只因.(进程继续运行)
如果没劝住,就直接掀桌(╯‵□′)╯︵┻━┻了,大家谁都别吃了,进程也就挂掉了.
注:下面在主方法中创建的线程属于主线程,在程序执行之后会自动启动线程.建议看完后面的1.3的一部分内容之后再来看这里.run()方法,start()方法,构造,sleep()方法都在后面.
(true){System.out.println(hello
(true){System.out.println(hello
通过实现Runnable接口,并在主线程为Tread的构造方法传入这个类的引用来创建线程对象.
(true){System.out.println(hello
MyTread());thread.start();while
(true){System.out.println(hello
}通过匿名内部类来创建线程对象.第一种是直接重写Tread接口中的方法,第二种是给Tread类的构造方法传入Runnable接口,并重写Runnable中的方法.
(true){System.out.println(hello
{Thread.sleep(1000);//Tread类中的一个static方法}
RuntimeException(e);}}}};thread.start();while
(true){System.out.println(hello
RuntimeException(e);}}}});thread.start();while
(true){System.out.println(hello
(true){System.out.println(hello
RuntimeException(e);}}});thread.start();while
(true){System.out.println(hello
Thread类是JVM⽤来管理线程的⼀个类换句话说每个线程都有⼀个唯⼀的Thread对象与之关
联。
⽤我们上⾯的例⼦来看每个执⾏流也需要有⼀个对象来描述类似下图所⽰⽽Thread类的对象就是⽤来描述⼀个线程执⾏流的JVM会将这些Thread对象组织起来⽤于线程调度线程管理.
方法说明Tread()创建线程对象Tread(Runnable
target)使用Runnable对象来创建线程Tread(String
属性获取方法idgetId()名称getName()优先级getPriority()状态getState()是否是后台线程isDaemon()是否存活isAlive()是否被中断isInterrupted()
拓展:把一个线程设置为后台线程的方法是线程引用.setDaemon(true).
id是线程的唯一标识,不同的线程不会重复名称可以通过jconsole看到.状态表示线程当前所处的⼀个情况下面我们会进⼀步说明.优先级高的线程理论上来说更容易被调度到.关于后台线程,我们要多唠几句:
首先什么是前台线程,这和我们平时所知道的前台不一样,这里指的前台线程是,前台线程运行不结束,Java程序永远不会结束,后台线程是,后台即使在运行,只要前台线程全部结束,也不可以阻止Java程序结束,当然后台线程的结束也不可以对Java程序的执行产生任何影响.(如gc线程,就是Java垃圾回收线程,是周期性持续执行的后台线程)
RuntimeException(e);}System.out.println(tread);});thread.setDaemon(true);//把tread线程设置为后台线程thread.start();System.out.println(main
这里我们可以看到,只打印了最后main线程的一句话,由于在tread设置为了后台线程,而且在线程中sleep了1s,tread还没来得及反应,前台线程main线程就已经结束了,整个进程就结束了,后台的tread也不得不结束.
由于马云和马化腾都是大老板,掌管者整个酒席的节奏,一桌酒席是否结束,由他们说了算.它们就是前台线程,掌管者整个进程.马云和马化腾掌管者整个酒席的节奏,它们都说结束才可以结束,要是有一个没喝好,就不可以结束.
突然有一个小喽啰实在喝不动了,提前溜了.但是酒席不可以结束,马爸爸和马爹爹还没有喝好,接着喝,可见后台进程的结束并不影响进程是否结束.
是否存活,线程中的线程引用是否被gc回收,这里不可以理解为线程是否还在执行,两者有一定的区别.线程终端问题,后序介绍.
作为专业的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