精华内容
下载资源
问答
  • 首先,要先说一下项目的需求,我要...所以就出现一个问题,当我要频繁的切换学科的时候,我这个展示的页面点击左上角返回的按钮(无论是怎样都要直接返回首页的),是返回上一个页面,并不能直接返回首页,所以就...

    首先,要先说一下项目的需求,我要实现的功能是 在首页有一个按钮可以跳转到一个展示的页面,这个展示的页面上下两个部分,上边的部分是可以切换学科种类的,下面的部分可以展示这个学科下的所有科目,上面切换的部分可以再跳转到另一个页面来选择学科,所以就出现一个问题,当我要频繁的切换学科的时候,我这个展示的页面点击左上角返回的按钮(无论是怎样都要直接返回首页的),是返回上一个页面,并不能直接返回首页,所以就这个问题想了好久,一步步的解决了。

     一、重构小程序的头部,这种方法对我这个项目来说不太合适,在这里就不多说了。

    二、利用小程序的unLoad这个生命周期,在这个生命周期中使用重定向,无论是到哪里,在卸载这个页面的时候,都让他跳转到固定的页面

    
      onUnload: function () {
        wx.reLaunch({
          url: '../home/home'
        })
      },

     但是这样就会出现很多问题,比如身份丢失,页面在跳转的时候会闪屏,用户体验的效果也是极差的,并不推荐使用这种方法,其实遇到这种问题,最好的方法还是第一种自己配置头部,但是这个在项目开始的时候就完成这个需求,不然等到项目中间再弄就非常的麻烦了

    三、利用wx.navigateBack()来实现页面的返回,并不是通过wx.navigateTo,这样就使得这个页面并不在返回跳转的路径中了。.

            但是这样有个问题,我们在跳转页面的时候,往往都是携带参数的,但是wx.navigateBack()是不能直接携带参数的,但是我们可以通过另一种方法直接操作上一个页面的data数据。

        var pages = getCurrentPages();
        var Page = pages[pages.length - 2];
         Page.setData({
           currentIndex: e.detail
         })
        console.log(e.detail)
        Page.clickCards(e.detail)
        //默认返回上一页
        wx.navigateBack()

    通过上述的代码,我们首先通过  getCurrentPages() 这个方法获取到页面栈,然后通过页面栈获取到上一个页面,然后可以直接嗲用上一个页面的方法,改变上一个页面的值,然后再通过navigateBack() 返回到上一个页面,这样就能比较好的解决我的那个问题了。

     

     

     

     

     

     

     

     

     

     

     

     

     

     

    展开全文
  • 模拟登陆知乎后,跳转到首页返回400,请求无效,应该是知乎对request请求有做要求。 看了下请求头,主要关注cookie、referer和user_agent(不要问为什么,我看视频的),cookie在scrapy.Request里有单独参数。...

    模拟登陆知乎后,跳转到首页,返回400,请求无效,应该是知乎对request请求有做要求。

    看了下请求头,主要关注cookie、referer和user_agent(不要问为什么,我看视频的),cookie在scrapy.Request里有单独参数。不管怎样,先测试下:

     

    # -*- coding: utf-8 -*-
    import scrapy,os,re
    from scrapy.http import Request
    from mouse import move
    class ZhihuSpider(scrapy.Spider):
        name = 'zhihu'
        allowed_domains = ['zhihu.com']
        start_urls = ['http://zhihu.com/']
    
        headers = {
            # "HOST": "www.zhihu.com",
            "Referer": "https://www.zhizhu.com",
            'User-Agent': "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.113 Safari/537.36"
        }
        custom_settings = {
            "COOKIES_ENABLED": True,
            'User-Agent':"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.113 Safari/537.36",
            'HTTPERROR_ALLOWED_CODES' : [400]
        }
        def parse(self, response):
    
            pass
    
        def parse_request(self,response):
            pass
    
        def parse_answer(self,response):
            pass
    
        def start_requests(self):
    
            from selenium import webdriver
            from scrapy.selector import Selector
    
            project_dir = os.path.abspath(os.path.dirname(os.path.dirname(__file__)))
    
            chromedriver_dir = os.path.join(project_dir, "tools\\chromedriver.exe")
            browser = webdriver.Chrome(
                executable_path=chromedriver_dir)
    
            browser.get("https://www.zhihu.com/signup?next=%2F")
    
            # 模拟登录知乎,选择登录选项
            # info = response.xpath('//*[@id="root"]/div/main/div/div/div/div[2]/div[2]/span/text()')
            browser.find_element_by_xpath('//*[@id="root"]/div/main/div/div/div/div[2]/div[2]/span').click()
            # 输入账号//*div[@class='SignFlow-accountInput Input-wrapper']/input
            browser.find_element_by_xpath(
                '//*[@id="root"]/div/main/div/div/div/div[2]/div[1]/form/div[1]/div[2]/div[1]/input').send_keys(
                "656521736@qq.com")
            # 输入密码
            browser.find_element_by_xpath(
                '//*[@id="root"]/div/main/div/div/div/div[2]/div[1]/form/div[2]/div/div[1]/input').send_keys("*****")
            # 模拟登录知乎,点击登录按钮
            # //*[@id="root"]/div/main/div/div/div/div[2]/div[1]/form/button
            browser.find_element_by_xpath('//*[@id="root"]/div/main/div/div/div/div[2]/div[1]/form/button').click()
            import time
            time.sleep(10)
            Cookies = browser.get_cookies()
            print(Cookies)
            cookie_dict = {}
            import pickle
            pickle.dump(Cookies,
                        open("./ArticleSpider/cookies/zhihu.cookie", "wb"))
            # for cookie in Cookies:
            #     # 写入文件
            #     zhihu_cookie_dir = os.path.join(project_dir, "cookies\\zhihu\\")
            #     f = open(zhihu_cookie_dir + cookie['name'] + '.zhihu', "wb")
            #     pickle.dump(cookie, f)
            #     f.close()
            #     cookie_dict[cookie['name']] = cookie['value']
            cookie_dict = {}
            for cookie in Cookies:
                cookie_dict[cookie["name"]] = cookie["value"]
            # browser.close()
            # return Request(url=r"https://www.zhihu.com/",headers=self.headers,cookies=cookie_dict,callback=self.check_login)
            return [Request(url=self.start_urls[0], dont_filter=True,headers=self.headers, cookies=cookie_dict)]

    在Request里加上headers,再跳转到parse时,response就能看到首页了:

     

    转载于:https://www.cnblogs.com/laonicc/p/10896973.html

    展开全文
  • 是刷新了,但是返回的是首页,我想要的 是一个页面分了3页,当我正在查看第三页,我从第三页打开另外一个页面,这时后退一步 应该后退第三页,而实际却后退了第一页,请问怎么解决??????????、
  • 实现起来,我想到:专门开个动态首页的action,在里面遍历用户的菜单,随机选择几个链接,然后根据链接反射对应业务报表的action中的方法,得到其中的报表数据,再返回给动态首页的jsp。 于是问题来了:跳转业务...
  • 百度首页的彩蛋里曾经有句话: 一个页面是怎样来到用户眼前的?欢迎投… 我们现在就来学习一下 我们UtTest项目现在的目录是这样的 urls.py管url和函数映射,views.py管逻辑处理。那么我们可以试验一下,新建一个url...

    百度首页的彩蛋里曾经有句话:
    一个页面是怎样来到用户眼前的?欢迎投…

    我们现在就来学习一下
    我们UtTest项目现在的目录是这样的
    在这里插入图片描述
    urls.py管url和函数映射,views.py管逻辑处理。那么我们可以试验一下,新建一个url映射,来让后台返回一句:你好 我去热饭!
    打开urls.py,它现在长这样
    在这里插入图片描述
    我们导入views.py

    from MyApp.views import *
    

    在下面的urlpattens 这个大列表中,添加一个新元素:
    在这里插入图片描述

    url(r'^welcome/$',welcome), #进入weclome欢迎页面
    

    这里不要写错,url函数传入俩个参数,第一个是路由的匹配正则表达式,第二个是views.py中与其关联的函数welcome,不过我还没有写welcome函数,所以下面标红正常!
    不要拉了逗号哦~ 毕竟这是在一个大列表(数组)中。

    如果我们发现项目下面运行框中显示报错并中止了,不要慌,因我们代码有语法错误,当离开文件编辑模式时候,就会触发重启,结果报错导致重启失败就中止了。这是因我们上么先关联了不存在的welcome函数导致的,没什么大不了的,一会我们写完这个函数,再点击启动即可!

    然后我们打开views.py文件。它长这样:
    在这里插入图片描述
    完全是个空的:
    我们先导入俩个必要模块: 用来给前端返回html相关的数据

    from django.http import HttpResponse,HttpResponseRedirect
    from django.shortcuts import render
    

    然后开始写这个welcome函数:
    在这里插入图片描述
    这时候我们可以试试看了。进入网址:http://127.0.0.1:8000/welcome/ 你会看到
    在这里插入图片描述

    这套链路我们算打通了,你小伙伴进这个网址看到的和你现在一样哦
    我们在urls.py中写的 ‘welcome/$’ 就是我们访问的时候在host后面接上/welcome/ 就可以命中这个映射,然后获得对应函数的返回值的。url的名字welcome和函数名welcome可以不一样哦。我只是怕后面讲课讲混乱了才一样的嘿嘿。

    大家现在想,我们通过return HttpResponse(‘你好 我去热饭!’) 来返回一句话成功了,那返回一个网页可以么?
    当然可以,这就是网页如何到用户眼前的过程。不过我们不用HttpResponse这个函数了。要用上面导入的另一个函数:render 来返回html页面。
    ![在这里插入图片描述](https://img-blog.csdnimg.cn/20191226181106548.png在这里插入图片描述
    render函数第一个参数必为request,也就是我们函数的行参request,这个参数是干嘛的?相当于把用户客户端的部分信息都带过来了。必须有这个,不然不知道你返回给哪个客户端哦~ 日后我们从reqeust这里面提取用户登录的id 用户名等等都可以。

    第二个参数 是我们的html页面,不过我们现在并没有html啊?,所以需要我们自己开始做html了呢。那么在哪新建一个html呢?
    django可不允许你随便找地方建一个html,这里就能给返回的,所以必须要按照django严格规定去建立一个文件夹。里面装所有html,我们管这些html叫做html模版。为啥叫模版?因为模版+不同的数据 = 真正完整的页面。对吧,不同的用户看订单页面发现都不一样对吧。模版是一个html,但是不同用户的数据是不一样的。最终看到的页面就是 模版+数据。
    言归正传。我们去哪里建造呢?
    django其实是可以修改这个位置和文件夹名字的,我们以后去settings.py中可以增加它定的位置文件夹哦!
    现在我们先用默认的,默认就是让你要自己手动去建造一个文件夹,位置和名称必须如下!
    在这里插入图片描述
    在MyApp中新建文件夹 tempaltes
    以后我们的html模版都只能放在这里了哦~

    我们新建一个html文件在这里插入图片描述
    叫做welcome.html
    在这里插入图片描述
    新建成功后,它会自动生成里面的一些基本内容
    我们试着在里面body 中间 加入一句话!
    你好!csdn的热饭!
    在这里插入图片描述
    我们点击pycharm之外的位置,让它自己赶紧自动热重启。看到一片白字+网址 说明重启成功,没有语法错误。
    在这里插入图片描述
    我们再进入或刷新该网址:http://127.0.0.1:8000/welcome/
    就会看到:
    在这里插入图片描述
    报错了。这个页面我们以后会很熟悉,经常遇到。所以不要慌。他说没找到我们的welcome.html文件。
    怎么可能明明有啊?
    其实虽然有,但是我们没有像这个项目注册我们的app : MyApp,所以项目没有去MyApp中找html
    所以我们现在要去注册:步骤很简单
    进入settings.py 找到这个列表:
    在这里插入图片描述
    它就是管理项目要注册哪些东西的列表。我们给它最后加上我们的app名字即可完成注册:
    在这里插入图片描述
    好了我们点击pycharm以外 让它重启。嫌麻烦或慢 可以直接手动点重启按钮在这里插入图片描述
    重启成功后,我们再进入这个网址:http://127.0.0.1:8000/welcome/
    就看到成功了!
    在这里插入图片描述
    这个跟一开始的那句纯文字可不一样,这是一个html网页,只是很简陋让你误以为是一段纯文字。我们现在去html中添加一下带颜色的字你就知道了是网页了。
    打开welcome.html,加上 这样一句,在body里面加哦。

        <span style="color:blue">你好!csdn的热饭!</span>
    

    在这里插入图片描述
    再去刷新页面,因我们没有改django后台逻辑代码,只是改了html模版页面,所以无需等待django项目热重启,你等它也不会重启,它只有检测到逻辑代码变更才会重启,html随便改,它叼都不叼一下的~

    我们只需要刷新浏览器页面 就可以了。
    现在我们看到
    在这里插入图片描述
    是不是成功了。
    我们刚刚加入的一句代码是html语言,span 标签是静态文案,它可以有style这个css设置属性,然后再style中我们 设置color颜色为 蓝色。
    html基础我后续也会给大家讲,碰到哪句讲哪,印象深刻!

    到这,我们一个真正的页面就成功了! 你也完成了从0 到1 的进化了。后面我们就是开始在疯狂的累加各种功能和页面了。欢迎订阅哦~
    开发一个项目真的不难~要有信心!

    展开全文
  • 我想在我的web项目(struts2+hibernate)的首页的页面输出数据库的News这个表的内容,请问具体的代码是怎样的,我都快点疯了。 --- 附我自己写的代码,及供参考,可忽略 在servlet中: public void ...
  • java

    2015-09-29 22:53:47
    首页 精选版块 论坛帮助 论坛...多线程 继承Runable接口,怎样将线程运行完后的结果返回到主线程 [问题点数:40分,结帖人undertones1985] 快速回复只显示楼主关注帖子 多线程 继承Runable接口,怎样将线程运行完...
    登录 | 注册
    首页 精选版块 论坛帮助 论坛牛人 论坛地图 专家问答
    CSDN > CSDN论坛 > Java > Java EE
    返回列表
    管理菜单 结帖 发帖 回复 关注关注
    多线程 继承Runable接口,怎样将线程运行完后的结果返回到主线程 [问题点数:40分,结帖人undertones1985] 快速回复只显示楼主关注帖子
    多线程 继承Runable接口,怎样将线程运行完后的结果返回到主线程 [问题点数:40分,结帖人undertones1985] 收藏
    undertones1985

    undertones1985
    undertones1985
    本版等级:T1
    结帖率:97.5%
    楼主 发表于: 2010-06-08 14:45:19
    大家好,我现在做一个项目只能用java 1.4版本,因此没办法用1.5版本中的Callable接口给主线程提供返回值。
    我做的是将各个独立的任务放在多个线程中同时进行,并希望他们在结束后将结果返回到主线程,请问这该怎么做啊,膜拜各路大侠给我指点指点!
    更多 0 分享到:
    相关主题推荐:

    对我有用[0] 丢个板砖[0] 引用 | 举报 | 管理 回复次数:26
    luozhangwen

    luozhangwen
    luozhangwen
    本版等级:T5
    #1 得分:0 回复于: 2010-06-08 14:48:05

    对我有用[0] 丢个板砖[1] 引用 | 举报 | 管理
    moshalanye

    moshalanye
    宁静-夏天
    本版等级:T5
    #2 得分:0 回复于: 2010-06-08 14:59:57
    天马行空--- 我的qq的签名也是这个 蛮巧的。

    主线程中创建一个数据访问安全的对象A,主线程启动的线程thread2初始化时,A作为thread2的初始化参数,thread2在run方法中把操作结果返回给对象A。

    主线程在thread2未完成操作时等待就好了,直到等待的thread2运行结束 进行下步操作。
    对我有用[0] 丢个板砖[0] 引用 | 举报 | 管理
    QQCrazyBoy

    QQCrazyBoy
    哈特中尉
    本版等级:T5
    #3 得分:5 回复于: 2010-06-08 15:01:20
    自定义的线程跑玩了就会自动去执行主线程啊!
    对我有用[0] 丢个板砖[0] 引用 | 举报 | 管理
    Silence_Smile

    Silence_Smile
    Silence_Smile
    本版等级:T5
    #4 得分:5 回复于: 2010-06-08 15:06:33
    自定义回调接口,子线程执行完后通过回调接口调用主线程中的回调方法
    对我有用[0] 丢个板砖[0] 引用 | 举报 | 管理
    moshalanye

    moshalanye
    宁静-夏天
    本版等级:T5
    #5 得分:0 回复于: 2010-06-08 15:10:01
    to QQCrazyBoy
    引用
    自定义的线程跑玩了就会自动去执行主线程啊!


    你自己测试下,是这样的吗?
    线程和线程之间是独立的。
    对我有用[0] 丢个板砖[0] 引用 | 举报 | 管理
    wwj85523

    wwj85523
    俊哥123
    本版等级:T2
    #6 得分:10 回复于: 2010-06-08 15:47:02
    主线程里放一个Hashtable ,业务线程把返回结果放进去,主线程里取。
    这样就OK了,另Hashtable是线程安全的,不需要另外加锁
    对我有用[0] 丢个板砖[0] 引用 | 举报 | 管理
    guliangliang

    guliangliang
    艾瑞儿
    本版等级:T2
    #7 得分:0 回复于: 2010-06-08 16:57:47
    学识浅薄,不太懂,学习下
    对我有用[0] 丢个板砖[0] 引用 | 举报 | 管理
    potahai

    potahai
    potahai
    本版等级:T3
    #8 得分:0 回复于: 2010-06-08 17:21:38
    继续关注
    对我有用[0] 丢个板砖[0] 引用 | 举报 | 管理
    undertones1985

    undertones1985
    undertones1985
    本版等级:T1
    #9 得分:0 回复于: 2010-06-08 18:42:55
    楼上的说的方法我还是不太懂,把问题再明确一下:
    每个线程结束都会得到一个List类型的数据,然后主线程需要创建一个更大的List类型的变量,把各个子线程的List数据保存进去,我就是这不太懂怎么实现,咋样创建Hashtable实现呢,况且我的进程数是根据输入任务不同,需要变化的,请再次赐教,在线等!
    对我有用[0] 丢个板砖[0] 引用 | 举报 | 管理
    undertones1985

    undertones1985
    undertones1985
    本版等级:T1
    #10 得分:0 回复于: 2010-06-08 18:48:24
    引用 2 楼 moshalanye 的回复:
    天马行空--- 我的qq的签名也是这个 蛮巧的。

    主线程中创建一个数据访问安全的对象A,主线程启动的线程thread2初始化时,A作为thread2的初始化参数,thread2在run方法中把操作结果返回给对象A。

    主线程在thread2未完成操作时等待就好了,直到等待的thread2运行结束 进行下步操作。


    请问一下,Runable接口中的run()函数是不允许有返回值的,如何返回?谢谢!
    对我有用[0] 丢个板砖[0] 引用 | 举报 | 管理
    mhl1003

    mhl1003
    mhl1003
    本版等级:T2
    #11 得分:10 回复于: 2010-06-08 19:15:15
    引用 10 楼 undertones1985 的回复:
    引用 2 楼 moshalanye 的回复:
    天马行空--- 我的qq的签名也是这个 蛮巧的。

    主线程中创建一个数据访问安全的对象A,主线程启动的线程thread2初始化时,A作为thread2的初始化参数,thread2在run方法中把操作结果返回给对象A。

    主线程在thread2未完成操作时等待就好了,直到等待的thread2运行结束 进行下步操作。


    请问一下,Run……

    设置一个static静态的变量就可以实现结果共享了。
    对我有用[0] 丢个板砖[0] 引用 | 举报 | 管理
    katasoft

    katasoft
    katasoft
    本版等级:T4
    #12 得分:0 回复于: 2010-06-08 19:16:10
    所有子线程都将结果写到公共的缓冲区中(注意并发问题),在启动子线程后,将主线程挂起(wait),直到所有子线程结束后唤醒主线程,此时便可以获取缓冲区中各个子线程写入的内容(相当于子线程饭后的结果)。
    对我有用[0] 丢个板砖[0] 引用 | 举报 | 管理
    undertones1985

    undertones1985
    undertones1985
    本版等级:T1
    #13 得分:0 回复于: 2010-06-08 19:52:10
    引用 11 楼 mhl1003 的回复:
    引用 10 楼 undertones1985 的回复:

    引用 2 楼 moshalanye 的回复:
    天马行空--- 我的qq的签名也是这个 蛮巧的。

    主线程中创建一个数据访问安全的对象A,主线程启动的线程thread2初始化时,A作为thread2的初始化参数,thread2在run方法中把操作结果返回给对象A。

    主线程在thread2未完成操作时等待就好了,直到等待的thr……


    我试过了,返回的是空值。静态变量只是对于许多类的实例可以这样实现数据共享,但是在多线程中式一个线程一个类的实例,这样做是不行的!!!
    对我有用[0] 丢个板砖[0] 引用 | 举报 | 管理
    moshalanye

    moshalanye
    宁静-夏天
    本版等级:T5
    #14 得分:10 回复于: 2010-06-08 20:40:33
    汗! 楼主我随便写下 大概是这个思路,我写的是伪代码。
    你自己再去改下吧

    main(){
    Map datas = new Hashedtable();
    MyThreadRun run = new MyThreadRun();
    run.setDatas(datas);
    Thread tt = new Thread(run);
    tt.start();

    while(!"result is ok".equal(datas.get("status"))){
    try{
    Thread.sleep(10000);
    }catch(Exception){
    //todo
    }
    }
    //或者使用join 具体的看下api
    tt.join();

    Object result = run.get("result");
    //dosomething
    }

    static Class MyThreadRun implements Runable{
    Hashedtable datas;
    public void setData(Map data){
    this.datas = data;
    }

    run(){
    //execute get the result
    this.datas.put("result",result);
    this.datas.put("status","result is ok");
    }
    }
    对我有用[0] 丢个板砖[0] 引用 | 举报 | 管理
    wwj85523

    wwj85523
    俊哥123
    本版等级:T2
    #15 得分:0 回复于: 2010-06-08 21:33:11
    Java code
    ?
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    main(){
    HashTable datas = new HashTable();
    MainThread mainThread=new MainThread(datas);
    mainThread.start();

    //这里的子线程可以多个
    MyThreadRun run = new MyThreadRun();
    run.setDatas(datas);
    Thread tt = new Thread(run);
    tt.start();

    }

    Class MyThreadRun implements Runable{
    Hashedtable datas;
    public void setData(Map data){
    this.datas = data;
    }

    run(){
    //execute get the result
    this.datas.put("result",result);
    this.datas.put("status","result is ok");
    }
    }

    class MainThread extends Thread{
    Hashtable table;
    public MainThread(Hashtable table){
    this.table=table;
    }
    public void run(){
    while(true){
    Thread.sleep(1000l);
    List result=table.remove("result");
    if(result!=null){
    //dosomething
    }

    }

    }
    }


    参照楼上的代码,随便改下,楼上的大哥不要生气哈。- -!!
    对我有用[0] 丢个板砖[0] 引用 | 举报 | 管理
    xusenjian

    xusenjian
    xusenjian
    本版等级:T2
    #16 得分:0 回复于: 2010-06-08 21:54:34
    概是这个思路,我写的是伪代码
    对我有用[0] 丢个板砖[0] 引用 | 举报 | 管理
    moshalanye

    moshalanye
    宁静-夏天
    本版等级:T5
    #17 得分:0 回复于: 2010-06-09 08:54:51
    to wwj85523

    你该成三个线程了,main方法执行的也有一个线程,不过这么写楼主可能更好理解。

    不过
    引用
    while(true){
    Thread.sleep(1000l);
    List result=table.remove("result");
    if(result!=null){
    //dosomething
    }


    要改一下,这样写线程不会死了,一般都是使用状态量来控制 while(isAlive)
    if(result!=null){
    //dosomething
    isAlive = false;
    }

    这样比较好,也可以使用Thread 内置的状态 interrupted
    while(isInterrupted()){
    //dosomething

    interrupted();
    }

    对我有用[0] 丢个板砖[0] 引用 | 举报 | 管理
    undertones1985

    undertones1985
    undertones1985
    本版等级:T1
    #18 得分:0 回复于: 2010-06-09 10:15:41
    引用 14 楼 moshalanye 的回复:
    汗! 楼主我随便写下 大概是这个思路,我写的是伪代码。
    你自己再去改下吧

    main(){
    Map datas = new Hashedtable();
    MyThreadRun run = new MyThreadRun();
    run.setDatas(datas);
    Thread tt = new Thread(run);
    tt.start();

    ……


    你这样写是针对只有一个子线程的,如果有多个子线程在同时执行,而且每个子线程结束任务并返回的时间是不同的,但是都返回值的的Hashtable表中的状态标记 "status" = finish.这样对于你的程序就只能返回最开始的一个线程值了。
    还有没有更好的方法呢?谢谢
    对我有用[0] 丢个板砖[0] 引用 | 举报 | 管理
    SDMRauquin

    SDMRauquin
    SDMRauquin
    本版等级:T6
    #19 得分:0 回复于: 2010-06-09 10:23:52
    要带返回值的线程。需要JDK1.5以上

    有Callable 这个
    详细的用法你去看资料。
    给你看看我简单的应用。
    根据返回值判断是否跳出循环的
    Java code
    ?
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Callable callable = new ReadInfoTimerTask(unicode, messages);
    Future future = null;
    int i = 1;
    while(messages[2].trim().equals("")) //unicode is empty
    {
    future = SSP.scheduledExecutor.schedule(callable, scanTime, TimeUnit.SECONDS);
    messages = (String[])future.get();
    i++;
    if(i>scanNO)
    // messages[3] = "timeOut";
    break;
    }


    这个是线程
    Java code
    ?
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    public class ReadInfoTimerTask implements Callable {

    private String key;
    private String[] messages;

    public ReadInfoTimerTask(String unicode, String[] messages){
    this.key = unicode;
    this.messages = messages;
    }

    public String[] call() throws Exception{
    if(SSP.resultList.get(key)!=null)
    {
    messages = SSP.resultList.get(key);
    SSP.resultList.remove(key);
    }
    return messages;
    }

    }


    这只是部分的代码,不能直接复制使用,仅供参考
    对我有用[0] 丢个板砖[0] 引用 | 举报 | 管理
    SDMRauquin

    SDMRauquin
    SDMRauquin
    本版等级:T6
    #20 得分:0 回复于: 2010-06-09 10:27:41
    说了才看见问题。。不能JDK1.5

    当我没说。。

    对我有用[0] 丢个板砖[0] 引用 | 举报 | 管理
    moshalanye

    moshalanye
    宁静-夏天
    本版等级:T5
    #21 得分:0 回复于: 2010-06-09 10:30:48
    楼主这个是伪代码,你怎么去判定是不是子线程都执行完毕,完全可以自己设计嘛。

    例如:引用计数器的方式。main thread 开启几个 son thread,就在计数器中+ji,
    son thread 运行结束,对计数器-1,当减到0的时候,main thread 判定 son thread 执行完毕,
    开始执行。

    引用计数器 就是一个线程共享的 线程安全的数据资源。之前的代码也给你了,你可以参照。

    引用计数器,在 lucene 2.32中 IndexReader 有引用计数器代码,当然有计数器代码的地方应该很多。

    你可以参照下。
    对我有用[0] 丢个板砖[0] 引用 | 举报 | 管理
    SDMRauquin

    SDMRauquin
    SDMRauquin
    本版等级:T6
    #22 得分:0 回复于: 2010-06-09 10:36:47
    public static ConcurrentHashMap<String, List[]> resultList = new ConcurrentHashMap<String, List[]>(); //ConcurrentHashMap支持多线程并发

    每个线程创建的时候,生成一个UniID保存成key。
    子线程返回的结果,根据这个key保存进resultList。

    主线程每隔一段时间去遍历这个list
    for(Map.Entry<String, List[]> entry : XXX.resultList.entrySet())
    {
    if(XXX)
    {
    method(entry.getValue(),entry.getKey());
    }
    XXX.resultList.remove(entry.getKey());
    }
    处理完移出list
    对我有用[0] 丢个板砖[0] 引用 | 举报 | 管理
    moshalanye

    moshalanye
    宁静-夏天
    本版等级:T5
    #23 得分:0 回复于: 2010-06-09 11:08:15
    ConcurrentHashMap 不仅仅是支持多线程并发了,它还提供了散列 sagement 的实现方式,分离了 segement 访问的同步锁,从而加速了同步访问速度。
    改进了以往 HashTable 或者 Collections.syn..(Map) 只提供一个 segement 和 单一的同步锁的情况。

    楼上的朋友很热衷 concurrent 包列。连续的几个建议都是使用这个包。

    这个地方没必要使用 ConcurrentHashMap,有点杀鸡用牛刀的感觉,简洁就好,自己设计成线程安全就可以了。
    对我有用[0] 丢个板砖[0] 引用 | 举报 | 管理
    BearKin

    BearKin
    BearKin
    本版等级:T7
    Blank
    #24 得分:0 回复于: 2010-06-09 11:48:57
    Java code
    ?
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    package thread;

    import java.util.ArrayList;
    import java.util.List;

    public class NoCallable {
    public static void main(String[] args) {
    List<TestThread> list = new ArrayList<TestThread>();
    for (int i = 0; i < 4; i++) {
    TestThread testThread = new TestThread(9999999999L);
    testThread.start();
    list.add(testThread);
    }
    boolean isLoop = true;
    while (isLoop) {
    try {
    Thread.sleep(1000 * 1);
    isLoop = false;
    for (TestThread testThread : list) {
    System.out.println(testThread.isAlive());
    if (testThread.isAlive()) {
    isLoop = true;
    }
    }
    System.out.println();
    } catch (InterruptedException e) {
    e.printStackTrace();
    }
    }

    for (TestThread testThread : list) {
    System.out.println(testThread.getResult());
    }
    }
    }

    class TestThread extends Thread {

    private long loopNum;
    private int result = 0;

    public TestThread(long loopNum) {
    this.loopNum = loopNum;
    }

    @Override
    public void run() {
    long currentNum = loopNum;
    boolean isOver = false;
    while (!isOver) {
    if (currentNum < 0) {
    isOver = true;
    }
    result++;
    currentNum = currentNum - 2;
    }
    }

    public long getLoopNum() {
    return loopNum;
    }

    public void setLoopNum(long loopNum) {
    this.loopNum = loopNum;
    }

    public int getResult() {
    return result;
    }

    public void setResult(int result) {
    this.result = result;
    }

    }


    这个不用Callable 线程这方面俺知识太少了 所以你凑货着看吧。。
    对我有用[0] 丢个板砖[0] 引用 | 举报 | 管理
    undertones1985

    undertones1985
    undertones1985
    本版等级:T1
    #25 得分:0 回复于: 2010-06-11 21:33:50
    谢谢大家,我已经搞定了,就如同上面说的那样。给线程类设置一个静态变量,就可以实现线程间的数据共享,然后再创建一个HashTable就可以实现将此线程内的数据传递给主线程。最后对刚起的各个子线程利用Join()方法,使他们全部允许完再回到主线程,就可以完成我的功能,在此谢谢大家。
    对我有用[0] 丢个板砖[0] 引用 | 举报 | 管理
    purple117

    purple117
    purple117
    本版等级:T1
    #26 得分:0 回复于: 2012-05-18 13:52:32
    可以贴出你的能成功实现的代码吗? 谢谢
    对我有用[0] 丢个板砖[0] 引用 | 举报 | 管理
    返回列表
    管理菜单 结帖 发帖 回复 关注关注
    本帖子已过去太久远了,不再提供回复功能。
    公司简介|招贤纳士|广告服务|银行汇款帐号|联系方式|版权声明|法律顾问|问题报告|合作伙伴|论坛反馈
    网站客服杂志客服微博客服webmaster@csdn.net400-600-2320|北京创新乐知信息技术有限公司 版权所有|江苏乐知网络技术有限公司 提供商务支持
    京 ICP 证 070598 号|Copyright © 1999-2014, CSDN.NET, All Rights Reserved GongshangLogo
    展开全文
  • 网上购物现已成为时尚,客户选择一个商品将其放入购物车,然后返回继续购物或者去收银台,这个功能怎样实现呢?今天capucivar就将使用PHP来实现这个购物车的功能。 首先,做一个简单的首页,从数据库中查询出来...
  • delphi 开发经验技巧宝典源码

    热门讨论 2010-08-12 16:47:23
    0102 使用DivMod函数返回两个操作数相除的商和余数 68 0103 使用Power函数返回底数的任何次幂 69 0104 使用Round函数将实数四舍五入为整数 69 0105 使用Sqr函数计算指定数的平方 70 0106 使用Mean函数计算...
  • 0102 使用DivMod函数返回两个操作数相除的商和余数 68 0103 使用Power函数返回底数的任何次幂 69 0104 使用Round函数将实数四舍五入为整数 69 0105 使用Sqr函数计算指定数的平方 70 0106 使用Mean函数计算...
  • 0102 使用DivMod函数返回两个操作数相除的商和余数 68 0103 使用Power函数返回底数的任何次幂 69 0104 使用Round函数将实数四舍五入为整数 69 0105 使用Sqr函数计算指定数的平方 70 0106 使用Mean函数计算...
  • 0102 使用DivMod函数返回两个操作数相除的商和余数 68 0103 使用Power函数返回底数的任何次幂 69 0104 使用Round函数将实数四舍五入为整数 69 0105 使用Sqr函数计算指定数的平方 70 0106 使用Mean函数计算...
  • 0102 使用DivMod函数返回两个操作数相除的商和余数 68 0103 使用Power函数返回底数的任何次幂 69 0104 使用Round函数将实数四舍五入为整数 69 0105 使用Sqr函数计算指定数的平方 70 0106 使用Mean函数计算...
  • 0102 使用DivMod函数返回两个操作数相除的商和余数 68 0103 使用Power函数返回底数的任何次幂 69 0104 使用Round函数将实数四舍五入为整数 69 0105 使用Sqr函数计算指定数的平方 70 0106 使用Mean函数计算...
  • Squid 中文权威指南

    2011-08-19 13:38:16
    cache确认 - 保证squid 不对用户返回过时数据。在重复使用缓存对象时,squid 经常从原始服务器确认它。假如服务器指示squid 的拷贝仍然有效,数据就发送出去。否则,squid升级它的缓存拷贝,并且转发给客户。 1.2 ...
  • word使用技巧大全

    热门讨论 2011-03-18 20:37:53
    十一、怎样使首页不显示页号呢? 9 十二、在word自动生成目录 9 十三、如何用制作出书籍目录效果 10 十四、Word中如何分节 10 1 Word中节的作用 10 2 分节符的使用 11 3分节后的页面设置 11 4分节与页码编号 11 5分...
  • 到底我们是怎样用 node 解决实际的业务需求的。 拿这次双十一的会场页举例: 1. 用户在不同的终端环境下访问 https://1111.tmall.com 这个网址,请求会直接来到 CDN 上。 2. CDN 对用户的终端环境进行...
  • <a href ="DesignQuestions/Center_right.jsp?page=1"> 首页|| <a href ="DesignQuestions/Center_right.jsp?page=<%=mypage-1%>"> 上一页 || <a href ="DesignQuestions/Center_right.jsp?page=<%=mypage+1%>...
  • 4.4.5 JVM中一次完整的GC流程是怎样的,对象如何晋升老年代,说说你知道的几种主要的JVM参数。 4.4.6 你知道哪几种垃圾收集器,各自的优缺点,重点讲下cms和G1,包括原理,流程,优缺点。 4.4.7 垃圾回收算法的...
  • asp.net知识库

    2015-06-18 08:45:45
    页面一postback,它就显示页面的最顶端,怎样让它定位在某一位置? 如何保证页面刷新后的滚动条位置 清除网页历史记录,屏蔽后退按钮! 如何传值在2个页面之间 :要求不刷新父页面,并且不能用Querystring传值 Asp...
  • 怎样运用取决于你怎样定义它们。你可以用list()或者array()来定义它们,也可以直接为数组赋值。数组的索引从0开始。虽然我在这里没有说明,但是你一样可以轻易的使用多维数组。 // 一个包含两个元素的数组 $a[0...
  • JSTL详细标签库介绍

    2010-11-01 16:37:44
    遇到异常时,程序可以根据提示来终止运行(但是处理关键任务是绝对不可以采用,〈神5返回仓温控系统〉?863项目。)<BR><BR><BR>16.4 java异常处理的基础:<BR><BR>java的异常处理适用于在一个方法中能够检测出错误...
  • 首页的SkyDriver公开文件夹中,可能需要用代理才能正常访问该空间——空间绝对稳定,不会丢失文件!) (最近工作重心不在SIP开发,SO本文档也没有机会更新,有技术问题也请尽量咨询他人,本人不一定能及时回复...
  • 想请问怎样能正确获取相应的question_id的值呢? <code><template> <div id="mainPage" style="height:100%;width:100%"> <!-- <a-layout id="...

空空如也

空空如也

1 2
收藏数 29
精华内容 11
关键字:

怎样返回到首页