算法总结

本文介绍了如何实现类似数据库功能的数据结构,通过权值和字符串排序,并探讨了Java中线程协同工作的例子,展示了如何利用信号量和ReentrantLock实现线程按顺序执行,并解释了精确唤醒线程的机制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

实现类似数据库功能:一个权值字段,一个字符串字段,要求显示表并按权值排序。

构造新的数据结构     权值:字符串,将新的数据结构放在线性表中再排序。


************************

java弹出对话框:JOptionPane

*******************************

线程协同工作:3个线程依次轮流对变量自增 1共5次

解析:利用信号量state=1,2,3判断应该属于哪个线程工作,当三个线程竞争时只有一个线程最终得到资源,其他利用while阻碍无法向下执行

设置公共资源:class Source{
public static int state=1;
public static int i=0;
public static Source source=new Source();     //加锁对象
}

对source加锁:synchronized (Source.source)


**************************************

以上方法唤醒在同一个资源上等待的所有线程,不能达到精确唤醒的目的,。精确唤醒要用到,ReentrantLock(资源),Condition(条件)

private int state = 1;  
    private int n = 1;  
    // 使用lock做锁  
    private ReentrantLock lock = new ReentrantLock();  
    // 获得lock锁的3个分支条件  
    private Condition c1 = lock.newCondition();  
    private Condition c2 = lock.newCondition();  
    private Condition c3 = lock.newCondition();  
  
    @Override  
    public void run() {  
        new Thread(new Runnable() {  
            public void run() {  
                for (int i = 0; i < 5; i++) {  
                    try {  
                        // 线程1获得lock锁后, 其他线程将无法进入需要lock锁的代码块.  
                        // 在lock.lock()和lock.unlock()之间的代码相当于使用了synchronized(lock){}  
                        lock.lock();  
                        while (state != 1)  
                            try {  
                                // 线程1竞争到了lock, 但是发现state不为1, 说明此时还未轮到线程1打印.   
                                // 因此线程1将在c1上wait  
                                // 与解法一不同的是, 三个线程并非在同一个对象上wait, 也不由同一个对象唤醒  
                                c1.await();  
                            } catch (InterruptedException e) {  
                                e.printStackTrace();  
                            }  
                        // 如果线程1竞争到了lock, 也通过了state判定, 将执行打印任务  
                        for (int j = 0; j < 5; j++) {  
                            System.out.println(Thread.currentThread().getName()  
                                    + ": " + n++);  
                        }  
                        System.out.println();  
                        // 打印完成后将state赋值为2, 表示下一次的打印任务将由线程2执行  
                        state = 2;  
                        // 唤醒在c2分支上wait的线程2  
                        c2.signal();  
                    } finally {  
                        // 打印任务执行完成后需要确保锁被释放, 因此将释放锁的代码放在finally中  
                        lock.unlock();  
                    }  
                }  
            }  
        }, "线程1").start(); 


************************************************************************************


找回家的算法法开始---运行-- cmd ---ping www.sexinsex.net

http://www.44pipi.com/

*************************************************************************************

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值