Java 线程知识

本文详细介绍了Java中多线程的基础概念、实现方法、线程的状态及其转换,并探讨了线程间的同步与互斥机制。通过售票系统和生产者-消费者模型的实例,展示了如何在实际应用中正确地运用这些概念。
java 牛逼的就是对多线程的处理,先贴点概念性的东西,可能不准确。

1.线程的基本概念、线程的基本状态及状态之间的关系
  线程就是应用程序中的一个可单独执行的,完成某种操作的程序块。
  多线程就是同一个应用程序中有多个可执行的程序块,它们可以并发执行。
状态:a.就绪,b.运行,c.synchronize阻塞,d.wait和sleep挂起,e.结束。wait必须在synchronized内部调用。
对线程进行控制:    
  start():用于调用run()方法使线程开始执行。
  stop(): 立即停止线程执行,其内部状态清零,放弃占用资源。
  suspend():暂停线程执行。线程的所有状态和资源保持不变,以后可以通过另一线程调用resume()方法来重新启动这个线程。 
  resume():恢复暂停的线程,安排暂停线程执行。  
  sleep(): 调整Java执行时间,所需参数是指定线程的睡眠时间,以毫秒为单位。
  join():调用线程等待本线程执行结束。
  yield():暂停调度线程并将其放在等待队列末尾,等待下一轮执行,使同优先级的 其它线程有机会执行 。 
  isAlive():判断线程目前是否正在执行状态中


2.线程与进程的区别?
  线程是指进程内的一个执行单元,也是进程内的可调度实体,一个进程中有很多个线程。
区别:
   (1)地址空间:进程内的一个执行单元;进程至少有一个线程;它们共享进程的地址空间;而进程有自己独立的地址空间;
   (2)资源拥有:进程是资源分配和拥有的单位,同一个进程内的线程共享进程的资源
   (3)线程是处理器调度的基本单位,但进程不是.


3.多线程有几种实现方法,都是什么?
   两种,一种是继承Thread类来实现;另一种是实现Runable接口。


4.多线程同步和互斥有几种实现方法,都是什么?、
  多线程同步主要是:分别是synchronized 和 wait与notify ;
  互斥也就是将资源顺序的排列一下,按照一定的顺序去访问,它使用 synchronized 关键字来实现,
  具体方法是:a.Object obj = new Object(); public void  execute(){synchronized(ojb){//do what you want ...}}


5.多线程同步和互斥有何异同,在什么情况下分别使用他们?举例说明。

  都是共同去访问资源,只是同步访问的时候,资源的访问是无序的,而互斥的时候,资源是有序的。

    

   无意间看了看、写上、

贴一个售票的线程:





int ticket_count = 0;

public TicketOffice() {

}

public TicketOffice(int ticket_count) {
super();
this.ticket_count = ticket_count;
}

public int getTicket_count(){
return ticket_count;
}

public void setTicket_count(int ticket_count){
this.ticket_count = ticket_count; 
}

/**
* sale tickets.
*/
public void sale_tickets0(){
ticket_count--;
if(ticket_count >= 0){  
            System.out.println("sale succeed ,there are : " + ticket_count +" tickets.");  
        }else{  
            System.out.println("there are no tickets !");  
        }
}

/**
* sale tickets.
*/
Object obj = new Object();
public void sale_tickets1(){
ticket_count--;
synchronized (obj) {
if(ticket_count >= 0){  
System.out.println("sale succeed ,there are : " + ticket_count +" tickets.");  
}else{  
System.out.println("there are no tickets !");  
}

}

/**
* sale 
* @param ticket_count
*/
public void sale0(int ticket_count){
final TicketOffice office = new TicketOffice(ticket_count);
for (int i = 0; i <5 ; i++) {
new Thread(new Runnable() {
@Override
public void run() {
while (office.getTicket_count()>0) {
office.sale_tickets0();
}
}
}).start();
}
}


/**
* sale 
* @param ticket_count
*/

public void sale1(int ticket_count){
final TicketOffice office = new TicketOffice(ticket_count);
for (int i = 0; i <5 ; i++) {
new Thread(new Runnable() {
@Override
public void run() {
while (office.getTicket_count()>0) {
office.sale_tickets1();
}
}
}).start();
}
}

public static void main(String[] args) {
TicketOffice office = new TicketOffice();
//office.sale0(100);
office.sale1(100);
}


以下是他人写的:生产者——>消费者


/**
* 内部类模拟一个消息队列,生产者和消费者就去操作这个消息队列
*/
private static class MessageQueue {
private String[] messages;// 放置消息的数据结构
private int opIndex; // 将要操作的位置索引


public MessageQueue(int size) {
if (size <= 0) {
throw new IllegalArgumentException("消息队列的长度至少为1!");
}
messages = new String[size];
opIndex = 0;
}

public synchronized void put(String message) {
// Java中存在线程假醒的情况,此处用while而不是用if!可以参考Java规范!
while (opIndex == messages.length) {
// 消息队列已满,生产者需要等待
try {
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
messages[opIndex] = message;
opIndex++;
System.out.println("生产者 " + Thread.currentThread().getName()+ " 生产了一条消息: " + message);
// 生产后,对消费者进行唤醒
notifyAll();
}


public synchronized String get() {
// Java中存在线程假醒的情况,此处用while而不是用if!可以参考Java规范!
while (opIndex == 0) {
// 消息队列无消息,消费者需要等待
try {
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
String message = messages[opIndex - 1];
opIndex--;
System.out.println("消费者 " + Thread.currentThread().getName()+ " 消费了一条消息: " + message);
// 消费后,对生产者进行唤醒
notifyAll();
return message;
}
}

/**
* test.
* @param args
*/
public static void main(String[] args) {


final MessageQueue message = new MessageQueue(10);
// 创建3个生产者,生产者负责生产消息
for (int p = 0; p < 3; p++) {
new Thread(new Runnable() {
@Override
public void run() {
while (true) {

message.put("消息来了!");

// 生产消息后,休息100毫秒
try {
Thread.currentThread().sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}, "Producer" + p).start();
}


// 创建3个消费者,消费者负责查看消息
for (int s = 0; s < 3; s++) {
new Thread(new Runnable() {
@Override
public void run() {
while (true) {

message.get();
// 消费消息后,休息100毫秒
try {
Thread.currentThread().sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}, "Consumer" + s).start();
}
}


【电力系统】单机无穷大电力系统短路故障暂态稳定Simulink仿真(带说明文档)内容概要:本文档围绕“单机无穷大电力系统短路故障暂态稳定Simulink仿真”展开,提供了完整的仿真模型与说明文档,重点研究电力系统在发生短路故障后的暂态稳定性问题。通过Simulink搭建单机无穷大系统模型,模拟不同类型的短路故障(如三相短路),分析系统在故障期间及切除后的动态响应,包括发电机转子角度、转速、电压和功率等关键参数的变化,进而评估系统的暂态稳定能力。该仿真有助于理解电力系统稳定性机理,掌握暂态过程分析方法。; 适合人群:电气工程及相关专业的本科生、研究生,以及从事电力系统分析、运行与控制工作的科研人员和工程师。; 使用场景及目标:①学习电力系统暂态稳定的基本概念与分析方法;②掌握利用Simulink进行电力系统建模与仿真的技能;③研究短路故障对系统稳定性的影响及提高稳定性的措施(如故障清除时间优化);④辅助课程设计、毕业设计或科研项目中的系统仿真验证。; 阅读建议:建议结合电力系统稳定性理论知识进行学习,先理解仿真模型各模块的功能与参数设置,再运行仿真并仔细分析输出结果,尝试改变故障类型或系统参数以观察其对稳定性的影响,从而深化对暂态稳定问题的理解。
本研究聚焦于运用MATLAB平台,将支持向量机(SVM)应用于数据预测任务,并引入粒子群优化(PSO)算法对模型的关键参数进行自动调优。该研究属于机器学习领域的典型实践,其核心在于利用SVM构建分类模型,同时借助PSO的全局搜索能力,高效确定SVM的最优超参数配置,从而显著增强模型的整体预测效能。 支持向量机作为一种经典的监督学习方法,其基本原理是通过在高维特征空间中构造一个具有最大间隔的决策边界,以实现对样本数据的分类或回归分析。该算法擅长处理小规模样本集、非线性关系以及高维度特征识别问题,其有效性源于通过核函数将原始数据映射至更高维的空间,使得原本复杂的分类问题变得线性可分。 粒子群优化算法是一种模拟鸟群社会行为的群体智能优化技术。在该算法框架下,每个潜在解被视作一个“粒子”,粒子群在解空间中协同搜索,通过不断迭代更新自身速度与位置,并参考个体历史最优解和群体全局最优解的信息,逐步逼近问题的最优解。在本应用中,PSO被专门用于搜寻SVM中影响模型性能的两个关键参数——正则化参数C与核函数参数γ的最优组合。 项目所提供的实现代码涵盖了从数据加载、预处理(如标准化处理)、基础SVM模型构建到PSO优化流程的完整步骤。优化过程会针对不同的核函数(例如线性核、多项式核及径向基函数核等)进行参数寻优,并系统评估优化前后模型性能的差异。性能对比通常基于准确率、精确率、召回率及F1分数等多项分类指标展开,从而定量验证PSO算法在提升SVM模型分类能力方面的实际效果。 本研究通过一个具体的MATLAB实现案例,旨在演示如何将全局优化算法与机器学习模型相结合,以解决模型参数选择这一关键问题。通过此实践,研究者不仅能够深入理解SVM的工作原理,还能掌握利用智能优化技术提升模型泛化性能的有效方法,这对于机器学习在实际问题中的应用具有重要的参考价值。 资源来源于网络分享,仅用于学习交流使用,请勿用于商业,如有侵权请联系我删除!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值