线程问题:高手求救:

petelhayan 2003-08-25 04:12:59
//选取页面未被处理的页面
public class share_class {
private int page_count;
private int page_id;
private boolean processing=false; //标志以下两个synchronized方法的执行.
boolean[] page_array;
public share_class(int page_count)
{
this.page_count=page_count;
page_array= new boolean[page_count]; //保存页面是否被处理的状态,因为boolean型默认为false,设false 为没被处理过.

}
synchronized int select_page ()
{
while(processing)//finish_page 正在处理,等待
{
try {
wait();
}
catch(InterruptedException e)
{
System.out.println("Exception:"+ e.toString());
}
}
int n;
for (n=0;n<page_count;n++)
{

if (!page_array[n] ) //找出没有被正在处理或已处理过的页
{
page_id = n+1; //因为ppt处理要从1开始;
break;
}
}
processing = true;
notify();

if (page_id> -1)
{
return page_id;

}
else
return -1;//没有页面了就返回 -1;
}
synchronized void finish_page(int page_id)
{
while(!processing)//select_page处理.
{
try
{
wait();
}
catch(InterruptedException e)
{
System.err.println("Exception :" + e.toString());
}
}
page_array[page_id] =true ; //update 对应页面数组位置为已处理过.
processing =false;
notify();

}
}


//处理页面的线程;
public class page_thread implements Runnable{

public page_thread(share_class share,Object pages,Hashtable hash)
{
this.share = share;
this.pages = pages;
this.h1 = hash;

}
public void run()
{
page_id = share.select_page();
share.finish_page(page_id);

if (page_id != -1) {
process page;
}}}

//主程序
....
public static void main(String[] args) {
....
int page_count = 50;
share_class test = new share_class(page_count);
Runnable runnable = new page_thread(test,pages,h1);

Thread thread1 = new Thread(runnable);
Thread thread2 = new Thread(runnable);
thread1.start();
thread2.start();

......
}


请大侠帮忙:

问题:1)share_class 我本意是进行同步处理,使线程不会处理同一页面,但是运行结果还是处理同一页面,
2) 本意是让thread1,thread2处理不同页面,两者负责将50页面全部处理完,但是两者都只处理了第一页,其他49页都没有处理,
请大侠帮忙解决同步问题和循环问题,
谢谢先.


...全文
99 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
petelhayan 2003-08-26
  • 打赏
  • 举报
回复
Thanks for your help .
i will study it clearly ,and think it over .
zhirenshao 2003-08-26
  • 打赏
  • 举报
回复
sorry, i must go now, the code I provide is not completely correct, I'll provide another one later time today, probably after 7:00pm
zhirenshao 2003-08-26
  • 打赏
  • 举报
回复
public class Share_class {
private int page_count;
private int page_id;
//private boolean processing=false; //标志以下两个synchronized方法的执行.
boolean[] page_array;
public share_class(int page_count)
{
this.page_count = page_count;
page_array = new boolean[page_count]; /*保存页面是否被处理的状态,因为boolean型默认为false,设false 为没被处理过.*/

}
public synchronized int select_page ()
{
int n;
for (n = 0 ; n < page_count ; n++)
{
if (!page_array[n] ) //找出没有被正在处理或已处理过的页
{
page_id = n + 1; //因为ppt处理要从1开始;
break;
}
}

if (page_id <= page_count) /* if page_id < page_count, it means there are still some pages left*/
return page_id;
else
return -1;//没有页面了就返回 -1;
}

public synchronized void finish_page(int page_id)
{
page_array[page_id] = true ; //update 对应页面数组位置为已处理过.
}
}


public class Page_thread implements Runnable{

Share_class share = null;
Object pages = null;
HashTable h1 = null;

public Page_thread(Share_class share,Object pages,Hashtable hash)
{
this.share = share;
this.pages = pages;
this.h1 = hash;
}
public void run()
{
int page_id = share.select_page();
if (page_id != -1) // if there are more pages
share.finish_page(page_id);

}

public static void main(String[] args) {
....
int page_count = 50;
Share_class test = new Share_class(page_count);
Runnable runnable = new Page_thread(test,pages,h1);

Thread thread1 = new Thread(runnable);
Thread thread2 = new Thread(runnable);
thread1.start();
thread2.start();
......
}
}

------------------
sorry, i can't type Chinese currently.

You don't have to use 'wait()' and 'notify()', because select_page() and finish_page() is synchronized, so the system will guarantee only one thread can call select_page() and finish_page() at one time.

If a second thread is trying to call select_page() while the first one is still calling, the system will block the second one untill the first thread finish its function and release the lock
CD2 2003-08-26
  • 打赏
  • 举报
回复
你编译通过了吗?
CD2 2003-08-26
  • 打赏
  • 举报
回复
你编译通过了吗?
zhirenshao 2003-08-26
  • 打赏
  • 举报
回复
我上面贴的大致思路应该对的。可能有些细节会有点偏差,不过不影响多线程的操作。
其实只要清楚synchronized的用法就可以了。 上面只用了synchornized的一种用法,synchronized还有另一种用法。 书上都有讲的。 也欢迎交流。 若需要交流,可以给我留言
CD2 2003-08-26
  • 打赏
  • 举报
回复
尽量吧改正思路贴上来,让大家分享。我这两天也在搞多线程。
从零开始讲述Java多线程的核心知识,通过板书和一步一步画图的方式,引领大家逐步去理解和掌握这些知识;并深入分析源码实现,理解背后的实现原理,知其然还要知其所以然。从多线程核心基础讲起,理解线程的风险,多种创建线程的方式;再到深入理解线程的状态;然后是线程的基本操作。系统、深入、快速上手实现多线程。 课程目标:    快速上手掌握Java多线程的经典课程,    系统、全面、深入掌握Java多线程的核心知识主讲老师:CC老师     20年Java开发和使用经验,多年的首席架构师和CTO,畅销原创书籍《研磨设计模式》的作者。         参与和领导了上百个大中型项目的设计和开发,在互联网应用系统架构、系统设计、    应用级框架和中间件开发等方面具有很多经验和领悟。    更为难得的是,入行20年,仍然奋战在技术一线,深知一线架构师需要掌握哪些技术、    掌握到什么程度、一线架构设计会遇到哪些坑、如何才能做出最合适的架构设计,经验最难得!适应人群:    想要系统、深入学习Java多线程    已有Java开发基础,想要快速掌握Java多线程    补充Java多线程知识,为进入一线大厂做准备学习方式:随到随学课程内容:第一节课:系统理解Java并发编程的知识体系    1:为什么要掌握Java并发编程    2:整个课程的目标    3:整个课程的学习内容第二节课:线程必备基础知识    1:理解线程是什么,理解进程,图示    2:理解轻量级的含义    3:理解时序调度,线程是时序调度的基本单元,图示    4:理解调度方式:抢占式,图示    5:理解我们写的程序基本都是多线程的应用,图示    6:理解并发和并行,图示    7:为什么需要线程第三节课:线程的风险    1:线程安全性问题,图示    2:线程的活跃度问题:死锁、饥饿、活锁,图示    3:线程的性能问题,这里主要是线程间切换 上下文的开销第四节课:创建线程的方式之一    1: 代码演示:实现Runnable接口的方式来创建线程    2:学习Thread类的方法和属性的应用    3:学习Thread类的源码第五节课:创建线程的方式之二    1:继承Thread的方式来创建线程    2:继续学习Thread类的源码,分析线程初始化过程    3: 代码演示:演示ThreadGroup    4: 代码演示:演示daemon线程,理解daemon线程和主线程的关系第六节课:创建线程的方式之三    1: 代码演示:匿名内部类的方式来创建线程    2:继续学习Thread类的源码,分析run方法的调用过程    3:代码演示:callable的方式来创建线程,带返回值    4: 学习FutureTask的部分源码,分析run方法到call方法的调用过程第七节课:线程状态详解    1:通过Thread源码来查看线程状态的定义    2:一步一步画图,讲述状态之间的变迁第八节课:线程的基本操作sleep 和yield    1:阅读Thread源码    2:代码演示:sleep的使用    3:代码演示:yield的使用    4:sleep和yield的对比理解第九节课:线程的基本操作join和interrupt    1:阅读Thread源码    2:代码演示:join的使用    3:代码演示:interrupt的使用这里是《Java并发编程与源码分析》的第一部分——讲述多线程核心基础实现快速上手多线程的经典之作   

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧