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();
}
}


源码来自:https://pan.quark.cn/s/a3a3fbe70177 AppBrowser(Application属性查看器,不需要越狱! ! ! ) 不需要越狱,调用私有方法 --- 获取完整的已安装应用列表、打开和删除应用操作、应用运行时相关信息的查看。 支持iOS10.X 注意 目前AppBrowser不支持iOS11应用查看, 由于iOS11目前还处在Beta版, 系统API还没有稳定下来。 等到Private Header更新了iOS11版本,我也会进行更新。 功能 [x] 已安装的应用列表 [x] 应用的详情界面 (打开应用,删除应用,应用的相关信息展示) [x] 应用运行时信息展示(LSApplicationProxy) [ ] 定制喜欢的字段,展示在应用详情界面 介绍 所有已安装应用列表(应用icon+应用名) 为了提供思路,这里只用伪代码,具体的私有代码调用请查看: 获取应用实例: 获取应用名和应用的icon: 应用列表界面展示: 应用列表 应用运行时详情 打开应用: 卸载应用: 获取info.plist文件: 应用运行时详情界面展示: 应用运行时详情 右上角,从左往右第一个按钮用来打开应用;第二个按钮用来卸载这个应用 INFO按钮用来解析并显示出对应的LSApplicationProxy类 树形展示LSApplicationProxy类 通过算法,将LSApplicationProxy类,转换成了字典。 转换规则是:属性名为key,属性值为value,如果value是一个可解析的类(除了NSString,NSNumber...等等)或者是个数组或字典,则继续递归解析。 并且会找到superClass的属性并解析,superClass如...
基于遗传算法辅助异构改进的动态多群粒子群优化算法(GA-HIDMSPSO)的LSTM分类预测研究(Matlab代码实现)内容概要:本文研究了一种基于遗传算法辅助异构改进的动态多群粒子群优化算法(GA-HIDMSPSO),并将其应用于LSTM神经网络的分类预测中,通过Matlab代码实现。该方法结合遗传算法的全局搜索能力与改进的多群粒子群算法的局部优化特性,提升LSTM模型在分类任务中的性能表现,尤其适用于复杂非线性系统的预测问题。文中详细阐述了算法的设计思路、优化机制及在LSTM参数优化中的具体应用,并提供了可复现的Matlab代码,属于SCI级别研究成果的复现与拓展。; 适合人群:具备一定机器学习和优化算法基础,熟悉Matlab编程,从事智能算法、时间序列预测或分类模型研究的研究生、科研人员及工程技术人员。; 使用场景及目标:①提升LSTM在分类任务中的准确性与收敛速度;②研究混合智能优化算法(如GA与PSO结合)在神经网络超参数优化中的应用;③实现高精度分类预测模型,适用于电力系统故障诊断、电池健康状态识别等领域; 阅读建议:建议读者结合Matlab代码逐步调试运行,理解GA-HIDMSPSO算法的实现细节,重点关注种群划分、异构策略设计及与LSTM的集成方式,同时可扩展至其他深度学习模型的参数优化任务中进行对比实验。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值