实现类似数据库功能:一个权值字段,一个字符串字段,要求显示表并按权值排序。
构造新的数据结构 权值:字符串,将新的数据结构放在线性表中再排序。
************************
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/
*************************************************************************************