线程问题

petelhayan 2003-08-19 05:48:33
我又来问了,多亏CSDN每天都给我送了10分,让我又有机会提问 了
一直没有弄清楚这个问题,所以自己写程序的时候总是得到错误的结果
比如我在处理页面,有page_count 个页面
我把线程写成:
for (int i=1;i<page_count;i++)
{
pagethread thread1 =new pagethread(i,object);//i来表示 处理的第几页
pagethread thread2 =new pagethread(i,object);
thread1.start();
thread2.start();
}
显然这样两个页面会同时作用于同一个页面,也没有达到我想要的结果,我想建两个线程来同时运行,
请问各位,怎么样写就使得它们不会处理同一个页面,又会体现多线程处理的特征呢?
...全文
29 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhirenshao 2003-08-22
  • 打赏
  • 举报
回复
楼主,我猜想你的意思是:你有很多个page,这些page可能是存在一个数组里面,或者是在一个LinkedList里面,然后你有多个线程在操作这个page数组,但每当一个线程从数组里取page的时候,你希望它取的是上一个线程操作的下一个page,是这样吗?

方法如下:

你可以先建立一个类来包装你的这些page (假设你已经有一个class Page)


class Pages {
private Page[] pages = new Page[10];//假设你只需要10个page
private int pageCount = 0;
public Pages(){/*在constructor里初始化pages数组的每个元素*/}
// 下面这个method是关键
public synchronized Page getPage(){
System.out.println("Page Count: " + pageCount);
return pages[pageCount++];
}
}

class TestThreadA extends Thread{
Pages pages;
public TestThreadA(Pages pages){ this.pages = pages; }
public void run(){
Page p = pages.getPage();
// do something on p
}

class TestThreadB extends Thread{
Pages pages;
public TestThreadB(Pages pages){ this.pages = pages; }
public void run(){
Page p = pages.getPage();
// do something on p
}


// 下面这个class是示范你怎么用的
public class Test{
public static void main(String[] args){
Pages pages = new Pages();
TestThreadA a = new TestThreadA(pages);
TestThreadB b = new TestThreadB(pages);
TestThreadA aa = new TestThreadC(pages);
a.start();
b.start();
c.start();
}
}

在main里面新建了三个线程,你可以看这三个线程的类的定义TestThreadA和TestThreadB,这三个线程都试图从pages里取出一个page。 但由于在class Pages里,getPage()这个方法是sychronized,所以在任何时刻,只有一个线程可以调用getPage()这个方法。 这也就保证了只有当一个线程取完page以后,另一个线程才可以取page. 请记住: 取page的唯一方法只有调用getPage(),而这个方法不允许多个线程同时调用它。 所以这就解决了楼主的问题了

不知道偶的理解时候正确
petelhayan 2003-08-20
  • 打赏
  • 举报
回复
那要这样的线程干什么?
cuihao 2003-08-19
  • 打赏
  • 举报
回复
thread.jion()
等此现成运行完之后在运行下面的
petelhayan 2003-08-19
  • 打赏
  • 举报
回复
我确实不懂synchronized,我的意思是这样
线程:
page_thread extends Thread{
private Object object;
private int page_order=1;//代表页面顺序号 .
public synchronized int page_add()//每运行一个这样的线程,应该使得页面加1,以便下一个线程不会处理同一个页面.
{
page_order ++;
return page_order;
}
public void run()
{
process page,//里面应该包括一个参数是第几页
}
}
不知这样定义对不对,在主程序里又是怎么样调用这个page_add()呢?

zhirenshao 2003-08-19
  • 打赏
  • 举报
回复
你是不是想,当一个线程在处理的时候,另一个不处理,然后两个线程轮着来,但总也不回同时来是不?

你可以用 sychronized 关键字来保护你的页面,这样,两个线程就不会同时操作了。 如果你不是很清楚具体怎么用sychronized,给我留言
shadow_dancer 2003-08-19
  • 打赏
  • 举报
回复
没太明白你的需求。不过如果每一个页面本身就是从一个单独的线程继承来的话,这样new一个页面本身也就是new了一个线程,不知道是不是能解决你的问题。按照我的理解来的,希望没理解错。

62,614

社区成员

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

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