安卓如何重复调用同一个线程里的run方法?

比如在一个页面里两个按钮,点第一个,成功执行run方法里的语句,然后点第二个就没反应,要么就闪退

5个回答

闪退报什么错,你将代码贴出来

u010168422
Dustray 在下面贴出来了,闪退是因为重复开启Looper.prepare(),然后就把它删了
大约 3 年之前 回复

public class Test2Activity extends Activity implements OnClickListener {
private TextView start_text;
private EditText team_Name, music_Name;
private String get_method;
private boolean thIsStart = false;

Thread th;

@SuppressLint("HandlerLeak")
private Handler handler = new Handler() {

    @Override
    public void handleMessage(Message msg) {
        // TODO Auto-generated method stub
        super.handleMessage(msg);
        Log.i("handler", "into handle");
        String result = msg.obj.toString();
        Log.i("mytag", "成功:" + result);
        // 将WebService返回的结果显示在TextView中
        start_text.setText("结果:" + result);
    }
};

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_test2);
    start_text = (TextView) findViewById(R.id.start_text);
    team_Name = (EditText) findViewById(R.id.teamName);
    music_Name = (EditText) findViewById(R.id.musicName);

    findViewById(R.id.start_btn).setOnClickListener(this);
    findViewById(R.id.pause_btn).setOnClickListener(this);
    findViewById(R.id.continue_btn).setOnClickListener(this);

    th = new Thread(new Runnable() {
        @Override
        public void run() {
            // TODO Auto-generated method stub

            try {
                Message msg = new Message();
                FoundWebServices fws = new FoundWebServices();
                msg.obj = fws.getRemoteInfo(team_Name.getText().toString(),
                        music_Name.getText().toString(), get_method);
                handler.sendMessage(msg);

            } catch (Exception e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
                Log.d("mytag", e.toString());
            } finally {
            }
        }
    });

}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.test2, menu);
    return true;
}

@Override
public void onClick(View v) {

    switch (v.getId()) {
    case R.id.start_btn:
        get_method = "getSynTime";
        break;
    case R.id.pause_btn:
        get_method = "pauseMusic";
        break;
    case R.id.continue_btn:
        get_method = "continueMusic";
        break;
    }
    if (thIsStart == false) {
        thIsStart = true;
        th.start();
    } else {
        th.run();
    }

}

}


然后run()里面调用getRemoteInfo()方法取得web services里的方法返回值

public String getRemoteInfo(String teamName, String musicName, String methodName)
throws Exception {
String WSDL_URI = "http://10.2.5.231:8080/DanceMusicWebServices/MusicSynPort?wsdl";// wsdl的uri
String namespace = "http://services.dustray.cn/";// namespace
//methodName = "getSynTime";// 要调用的方法名称

    SoapObject request = new SoapObject(namespace, methodName);
    // 设置需调用WebService接口需要传入的两个参数mobileCode、userId
    request.addProperty("arg0", teamName);
    request.addProperty("arg1", musicName);
    // 创建SoapSerializationEnvelope 对象,同时指定soap版本号(之前在wsdl中看到的)
    SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(
            SoapSerializationEnvelope.VER10);
    envelope.bodyOut = request;// 由于是发送请求,所以是设置bodyOut
    envelope.dotNet = false;// 是否是.net开发的webservice
    HttpTransportSE httpTransportSE = new HttpTransportSE(WSDL_URI);
    httpTransportSE.call(namespace + methodName, envelope);// 调用
    // 获取返回的数据
    SoapObject object = (SoapObject) envelope.bodyIn;
    // 获取返回的结果
    try {
        result = object.getProperty(0).toString();

    } catch (Exception e) {
        result = "失败";

    }

    return result;

}

我建议你应该将Thread封装成一个方法,你点击按钮不同的发送消息,在主线程中里分别处理

u010168422
Dustray 我想把thread放到新建的一个类里,可是不知道handler怎么处理。求教。
大约 3 年之前 回复
u010168422
Dustray 那handler也跟这个thread一起封装到那个方法里吗?
大约 3 年之前 回复

把错误信息log发出来

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
如何重复调用线程?
我定义一个线程,执行一个函数,在执行完之后,线程处于stopped状态,如何再次调用?下面我标记的地方怎么写?rn private m_MyThreadDeleteSMS As New Thread(AddressOf InitSMS) rnrn调用如下: rn Select Case m_MyThreadDeleteSMS.ThreadStatern Case ThreadState.Unstartedrn m_MyThreadDeleteSMS.Start()rn Case ThreadState.Stoppedrn 这儿的代码如何写?rn Case ThreadState.Runningrn End Selectrnrn刚开始学着使用线程,请指教
是启动线程和调用线程的run方法
public class Test { public static void main(String[] args) { Thread t=new Thread(){ public void run() { fun(); }; }; //注意
Java 线程共用run方法里的代码段吗?
java的线程里run方法里的代码段,new几个Thread类一块运行时,内存中只有一套代码吧?rnrn如果是多核的话,如果有4核,那是不是内存中有4套代码比较快?
重复启动同一个线程类
如果快速反复启动同一个线程类,这个线程类的功能是使用ProcessBuilder类调用外部命令。rn而外部命令的功能是将xsl转换成pdf,rn那么有没有可能有的pdf生成不出来?或者说线程阻塞?数据丢失?
线程的start和run方法的区别
从源码看start()方法调用了本地方法start0() private native void start0(); 接下来我们看下start0是怎么回事 打开http://hg.openjdk.java.net/jdk8u/jdk8u/jdk/ 选择browse,然后在右侧点击src --》 share --》 native --》 java --》 lang --》Thread.c 也可...
关于使用线程调用run方法的问题
rn  rn 大家好,该程序在调用tt.start()方法时为什么没有直接去调用run()方法,而是执行完for循环后才调用的run()方法?
线程里面start和run方法
两种情况 1.start  Thread t = new Thread(xx); t.start(); 2.run Thread t = new Thread(xx); t.run(); 这两种情况是有区别的。 第一种情况是另外开启线程执行run()方法。 第二张情况不会另外开启线程,会在本线程里执行run()方法,此时就相当于调用一个普通的方法。...
各位,线程的run方法不允许抛出异常,那我的调用程序如何得知线程里发生了异常?
-
在java线程的run方法里在new多个线程可以吗?
在java线程的run方法里在new多个线程可以吗,我要写个定时器定时执行一个线程,可以不可以在这个线程的run方法里在new多个线程执行任务,执行的结果在run方法里汇总然后返回n[b]问题补充:[/b]nto 和你在一起:我用了TimerTask,然后用join等每个线程执行完后返回结果好像可以吗
run方法的重写和调用
本课程系统地讲解了Java核心类库和设计,为你的攻城狮之路打下坚实基础。
run方法里的循环
run方法里的循环有什么作用啊,为什么要用循环,可以不用么?
java线程的start和run方法解析
自定义线程两种方法 自定义一个runnable接口的实现类,然后构造一个thread,即对thread传入一个runnable接口类。 new一个thread或者写个thread子类,覆盖它的run方法。(new 一个thread并覆盖run方法实际上是匿名内部类的一种方式) 示例代码 public static void main(String[] args) { new T
线程run方法和start方法的区别
区别 run() 只是一个普通的方法调用,不会开启新的线程。 start() 会开启新的线程,分配新的资源。里面的变量互不影响。 实例 package multithreading; public class MyThread extends Thread { String flag; public MyThread(String flag) { t
在一个FOR循环语句里如何调用同一个存储过程
如题,rnfor i=1 to 20rn declare proc_1 procedure for proc_1 .....rn execute proc_1;rn close proc_1;rnnextrn这样好像不行,因为当i=2的时候就会提示有重复的存储过程了
如何重复启动线程
小弟现在遇到一个问题,希望能借助多线程,隔一段时间就清空数据显示,但是当[color=#FF0000]重复调用[/color]Thread.Start(),就会遇到rn“[color=#FF0000]A first chance exception of type 'System.Threading.ThreadStateException' occurred in mscorlib.dll[/color]”提示的错误是:[color=#FF0000]线程正在运行或被终止;它无法重新启动[/color]。rnrn为了方便大家明白我的问题,我编了个简化的版本rn窗体上有一个button和timer控件rnrn以下是窗体的代码rn[code=VB.NET]rnImports System.ThreadingrnPublic Class Form1rn Private ThreadCleanData As System.Threading.Threadrn Private Declare Function timeGetTime Lib "winmm.dll" Alias "timeGetTime" () As Longrn Private LockedObj As New Objectrn Public ISI As Long = 15 '发送信号15毫秒后,清除寄存器rn Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Loadrn ThreadCleanData = New System.Threading.Thread(AddressOf CleanDataRoutine)rn ThreadCleanData.Priority = Threading.ThreadPriority.AboveNormalrn With Timer1rn .Interval = 2000 '2000毫秒调用一次rn .Enabled = Falsern End Withrn With Button1rn .Text = "Start"rn End Withrn End Subrn Private Sub CleanDataRoutine()rn Dim tmStart As Long = timeGetTimern SyncLock LockedObjrn While timeGetTime - tmStart < ISIrn End Whilern ClearData()rn End SyncLockrn End Subrn Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tickrn SendData(Rnd() * 1000)rn ThreadCleanData.Start() '这句话是程序出错的位置rn End Subrn Private Sub SendData(ByVal Data As Integer)rn Debug.Print(Data) '打印rn End Subrn Private Sub ClearData()rn Debug.Print(0) '清空rn End Subrn Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Clickrn Timer1.Enabled = Truern End SubrnEnd Classrnrn[/code]rnrn希望大家能点拨一下我多线程应该如何写。
run方法
Angularjs模块的run方法初始化全局的数据 ,只对全局作用域起作用 如$rootScope &amp;lt;script type=&quot;text/javascript&quot;&amp;gt; var m1 = angular.module('myApp',[]); m1.run(['$rootScope',function($rootScope){ $rootScope.name = 'hell...
在同一个main函数里重复运行两段程序出错
从网上找了个读取图像的C语言程序,单独运行是可以的。读取完了一幅图像,想把上面的程序复制一下,改了里面的一些参数名称,就出错了,什么原因?里面的结构体都定义过了,没有问题。[code=C/C++]rn typedef unsigned char BYTE; rn typedef unsigned short WORD; rn typedef unsigned long DWORD; rn typedef long LONG; rn BITMAPFILEHEADER bitHead; rn BITMAPINFOHEADER bitInfoHead; rn FILE* pfile; rnrn rn char strFile[50]; rn printf("请输入背景图像文件名(.bmp):\n"); rn scanf("%s",strFile); rn rn pfile = fopen(strFile,"rb");//打开文件 rn rn if(pfile!=NULL) rn rn printf("File open success.\n"); rn //读取位图文件头信息 rn WORD fileType; rn fread(&fileType,1,sizeof(WORD),pfile); rn if(fileType != 0x4d42) rn rn printf("File is not .bmp file!"); rn return; rn rn //fseek(pfile,2,SEEK_CUR); // "BM" rn rn fread(&bitHead,1,sizeof(tagBITMAPFILEHEADER),pfile); rn rn rn //读取位图信息头信息 rn fread(&bitInfoHead,1,sizeof(BITMAPINFOHEADER),pfile); rn rn else rn rn printf("File open fail!\n"); rn return; rn rn rn rn tagRGBQUAD *pRgb ; //指向实际图像的颜色的指针 rn rnrn if(bitInfoHead.biBitCount < 24)//有调色板 rn rn //读取调色盘结信息 rn long nPlantNum = long(pow(2,double(bitInfoHead.biBitCount))); // Mix color Plant Number; rn pRgb=(tagRGBQUAD *)malloc(nPlantNum*sizeof(tagRGBQUAD)); rn memset(pRgb,0,nPlantNum*sizeof(tagRGBQUAD)); rn int num = fread(pRgb,4,nPlantNum,pfile); //返回读取了多少字节 rn rn rn int width = bitInfoHead.biWidth; rn int height = bitInfoHead.biHeight; rnrn //分配内存空间把源图存入内存 rn int l_width = WIDTHBYTES(width* bitInfoHead.biBitCount);//计算位图的实际宽度并确保它为32的倍数 rn BYTE *pColorData=(BYTE *)malloc(height*l_width); //为实际图像所占字节数分配内存 rn memset(pColorData,0,height*l_width); //初始化分配的内存rn long nData = height*l_width; rn rn //把位图数据信息读到数组里 rn fread(pColorData,1,nData,pfile); rn rn //将位图数据转化为RGB数据 rn tagRGBQUAD* dataOfBmp; rn dataOfBmp = (tagRGBQUAD *)malloc(width*height*sizeof(tagRGBQUAD));//用于保存各像素对应的RGB数据 rn memset(dataOfBmp,0,width*height*sizeof(tagRGBQUAD)); //为调色板分配内存rn rn if(bitInfoHead.biBitCount<24)//有调色板,即位图为非真彩色 rn rn int k; rn int index = 0; rn if (bitInfoHead.biBitCount == 1) //如果每像素用1位表示,黑白图像rn rn for(int i=0;i>7; rn break; rn case 1: rn mixIndex = mixIndex<<6; rn mixIndex = mixIndex>>7; rn break; rn case 2: rn mixIndex = mixIndex<<5; rn mixIndex = mixIndex>>7; rn break; rn rn case 3: rn mixIndex = mixIndex<<4; rn mixIndex = mixIndex>>7; rn break; rn case 4: rn mixIndex = mixIndex<<3; rn mixIndex = mixIndex>>7; rn break; rn rn case 5: rn mixIndex = mixIndex<<2; rn mixIndex = mixIndex>>7; rn break; rn case 6: rn mixIndex = mixIndex<<1; rn mixIndex = mixIndex>>7; rn break; rn rn case 7: rn mixIndex = mixIndex>>7; rn break; rn rn rn //将像素数据保存到数组中对应的位置 rn dataOfBmp[index].rgbRed = pRgb[mixIndex].rgbRed; rn dataOfBmp[index].rgbGreen = pRgb[mixIndex].rgbGreen; rn dataOfBmp[index].rgbBlue = pRgb[mixIndex].rgbBlue; rn dataOfBmp[index].rgbReserved = pRgb[mixIndex].rgbReserved;rn index++; rn rn rn rn rn rn if(bitInfoHead.biBitCount == 4) //每像素要4bit表示,8色图像rn rn for(int i=0;i>4; rn rn else rn //高 rn mixIndex = mixIndex>>4; rn rn rn dataOfBmp[index].rgbRed = pRgb[mixIndex].rgbRed; rn dataOfBmp[index].rgbGreen = pRgb[mixIndex].rgbGreen; rn dataOfBmp[index].rgbBlue = pRgb[mixIndex].rgbBlue; rn dataOfBmp[index].rgbReserved = pRgb[mixIndex].rgbReserved; rn index++; rn rn rn rn rn if(bitInfoHead.biBitCount == 8) //每像素要8bit表示,256色图像rn rn for(int i=0;i
线程run方法里方法执行问题求大神骂
public void run() rn try rn doExportFile(); rn preReportDel();rn rn appExpFileInfo odr = (appExpFileInfo) preReportDownload();rn service.save(odr);rn rn // service.remove(del.getFileName());rn catch (Exception e) rn e.printStackTrace();rn status = DownloadThreadFenboCon.status_completed;rn throw new BizException(1, 0, "2002", "下载失败!");rn rn status = DownloadThreadFenboCon.status_completed;rn synchronized (lock) rn lock.notify();rn rn以上run方法如果debugge一步一步走,可以执行完doExportFile();再执行 preReportDel();再执行 preReportDownload();rnrn如果不debugge,那么方法doExportFile();方法执行5遍, preReportDel();再执行5遍 preReportDownload();再执行5便rnrn就是一步一步走的话控制台打日志是123,123,123,123,123rn不打断点是11111,22222,33333 这个是怎么回事,再线等大神回答。
多个线程同一个线程如何同步?
我做了7个线程,前面6个可以独立运行,但我要求前面6个线程一起与第7个线程进行同步---前面6个线程只要有一个在运行,第7个线程就必须要停下来,反过来,只要第7个线程在运行,那么前面6个线程也必须要停下来,但这6个线程之间不需要同步,各位大虾,该怎么做?
Thread_如何给run方法传参_如何实现处理线程的返回值
如何给run方法传参 1.构造函数传参 2.成员变量传参 3.回调函数传参 如何实现处理线程的返回 1.主线程等待法:缺点代码臃肿 package com.interview.javabasic.thread; public class CycleWait implements Runnable{ private String value; public void r...
菜鸟问题:线程的run方法是在什么时候调用的呢?
标题说不清楚看代码:一个死锁的程序 数字位程序的执行过程。我想问的是为什么run()方法不在[color=#FF0000]第3步后[/color]直接执行,而是要在[color=#FF0000]a.foo(b)[/color]之后执行呢?rnpackage com.yanghaolin.deadLock;rnrnclass A rnrn synchronized void foo(B b) [color=#339966]//5[/color]rn String name = Thread.currentThread().getName();[color=#339966]//6[/color]rn System.out.println(name + " entered A.foo");[color=#339966]//7[/color]rn tryrn Thread.sleep(1000);[color=#339966]//8[/color]rn catch(InterruptedException e)rn e.printStackTrace();rn rn System.out.println(name + " trying to call B.last()");[color=#339966]//15[/color]rn b.last();[color=#339966]//16[/color]rn rnrn synchronized void last() [color=#339966]//20[/color]rn System.out.println("inside A.last");rn rnrnrnclass Brnrn synchronized void bar(A a) [color=#339966]//11[/color]rn String name = Thread.currentThread().getName();[color=#339966]12[/color]rn System.out.println(name + " entered B.bar");[color=#339966]//13[/color]rn tryrn Thread.sleep(1000);[color=#339966]//14[/color]rn catch(InterruptedException e)rn e.printStackTrace();rn rn System.out.println(name + " trying to call A.last()");[color=#339966]//18[/color]rn a.last();[color=#339966]//19[/color]rn rnrn synchronized void last() [color=#339966]//17[/color]rn System.out.println("inside B.last");rn rnrnrnpublic class DeadLock implements Runnablernrn A a = new A();rn B b = new B();rn public DeadLock()rn Thread.currentThread().setName("MainThread");[color=#339966]//2[/color]rn new Thread(this).start();[color=#339966]//3[/color]rn a.foo(b);[color=#339966]//4[/color]rn System.out.println("back in main thread");rn rnrn public void run()rn Thread.currentThread().setName("RacingThread");[color=#339966]//9[/color]rn b.bar(a);[color=#339966]//10[/color]rn System.out.println("back in other thread");rn rnrn public static void main(String[] args)rn new DeadLock();[color=#339966]//1[/color]rn rn
有关WinForm中重复调用同一个窗体?
这个主窗体有增删改查的功能,但是都要经过管理员的验证才能实现,从而跳出相应的窗体?请问如何实现?rn比如:rn我要删除一条记录,点击删除,跳出验证对话框,验证是否是管理员才能进入相应的窗体进行删除。我要添加一条记录,点击添加,跳出验证框,验证是否是管理员才能进入相应的窗体进行添加。rn但是验证框只有一个,如果重复的调用?
MFC中重复调用同一个窗口
本人菜鸟,刚学mfc没几天。rn现在输入一个数值n,按下按钮重复调用n次对话框,就是每次设置完对话框可以点击“设置下一个对话框这样的按钮”。。。rn举个例子:比如要设置n个人的信息,需要重复调用n次信息设置对话框。每次设置调用的对话框标题是“设置第K个人的信息”。rn不用数据库实现,因为我不需要保留这些信息。。。rn可以实现吗
关于线程里的run方法和图形界面问题????(高手请进)
我在编译一个两个人竞赛跑的问题时 rn想随机调用sleep()里的时间 rn于是写了个 rng.drawRect(x,100,20,20); //运动员的图形 rng.clearRect(x-1,100,20,20); //删除运动员的前一图形 rntrysleep(1000*(int)Math.random()); rncatch(Expection e) rn的run方法(部分代码) rn但是运行的时候很快就过去了,而且没有消除之前的图形 rn请问一下高手这是为什么???
线程中run方法可以调用非static方法?!
[code=java]rnpublic class ThreadSafeTest extends Thread rn private static Integer num = 1;rn rn /**rn *构造方法rn *@param name 线程的名称,本实例对应售票员名称 rn */rn public ThreadSafeTest(String name) rn setName(name);rn rn rn @Overridern public void run() rn synchronized (num) rn if (num > 0) rn System.out.println(getName() + ":检测票数大于0");rn System.out.println(getName() + ":\t正在收款(大约5秒完成)……");rn try rn Thread.sleep(5000);rn System.out.println(getName() + ":\t打印票据,售票完成");rn num--;rn printNumInfo();rn catch (InterruptedException e) rn e.printStackTrace();rn rn else rn System.out.println("没有票了,停止出售");rn rn rn rn rn rn private void printNumInfo() rn System.out.println("系统:当前剩余票数:" + num);rn if(num < 0)rn System.out.println("警告:票数低于0,出现负数");rn rn rn rn public static void main(String[] args) rn try rn new ThreadSafeTest("售票员张三").start();rn Thread.sleep(2000);rn new ThreadSafeTest("售票员李四").start();rn catch (InterruptedException e) rn e.printStackTrace();rn rn rn rn rn[/code]rnrnprintNumInfo()是非静态方法,但是却能直接在run方法中调用
多线程执行顺序以及run方法的调用
1.多线程的执行顺序先来看一个例子:public class test { public static void main(String[] args) { System.out.println(Thread.currentThread().getName()); } }输出结果:main这个例子说明一个问题:一个Java程序至少会有1个线程在运行,就如上面的main()方法,它是...
在线程中如何调用CxxView里的函数?
rn//CThreadView.cpprn#include "CThreadView.h"rn#include "afxmt.h"rnvoid CThreadView::FillList()rn;rnUINT ReadThreadProc(LPVOID param)rnrn rn CThreadView::FillList();rn return 0;rnrnFillList()是定义为公有的.rn错误提示:rn : error C2248: 'CThreadView::CThreadView' : cannot access protected member declared in class 'CThreadView'rnrn第一次用线程。请各位达人告诉我能不能这样用?如果能该怎么实现?谢谢!rn
run方法的重写和start方法的调用
本课程系统地讲解了Java核心类库和设计,为你的攻城狮之路打下坚实基础。
子线程调用run方法为什么是主线程调用的
[code=java]public class Testrnrnrn rn public static void main(String[] args) throws Exception rn rn A a = new A();rn a.start();rn a.run();//为什么是主线程调用,是a调用自己的run方法啊rn rnrn rnrnclass A extends Threadrnrn rn public void run()rn rn for(int i=0; i<10; i++)rn rn System.out.println(currentThread().getName()+":"+i);rn tryrn sleep(100);rn catch(Exception e)rn rn rn rn rn[/code]
每个线程调用的是同一个ThreadTest对象
我们接着修改ThreadDemo1,在main方法中创建四个Thread对象:   public class ThreadDemo1{   public static void main(String[] args){   newww.100ksw.comain(String[] args){   ThreadTest t = new ThreadTest();   new Thread
多个线程调用一个dll的同一个接口
程序加载了一个dll,之后该程序的多个线程调用一个dll的同一个接口。rn一个线程调用dll的这个接口之后,这个接口还没有返回,另一个个线程又调用了这个接口,那么dll中,是处理怎么第二个调用的?是让第二个调用等待,还是和第一个接口并行调用?
Java中启动线程start和run方法的区别
Java中启动线程有两种方式,继承Thread类以及实现接口Runnable,由于Java无法实现多重继承,故经常通过实现接口Runnable来创建线程。但是无论哪种方式创建都可以通过start()和run( )方法来启动线程,下面就来介绍一下两者的区别。 start():通过该方法启动线程的同时也创建了一个线程,真正实现了多线程,这是无需等待run()方法中的代码执行完毕就可以直接执行下面
怎么样保证线程的run方法执行完啊?
threadrnString s=null;rnrunrn s="ppoiot";rnrnrngets()rnreturn srnrnrnrnrn调用的gets()的时候,s为null,怎么样可以保证调用s之前run执行完啊
不同线程调用同一个方法出现的问题
有一个DateUtil类,如下: [code=&quot;java&quot;]package com; import java.text.SimpleDateFormat; import java.util.Date; public class DateUtil { private static final SimpleDateFormat yyyyMmDd = new SimpleDateForm...
多个线程调用同一个函数的同步问题?
多个线程调用同一个函数的同步问题。
谁知道多个线程调用同一个全局函数的机制?
比如说,调用过程? 全局函数内部的局部变量存放在哪里?假设全局函数内部没有全局变量和静态变量的话,调用函数会有冲突么?
两个线程调用同一个指针的问题
我有一个动态链接库,在这个动态链接库中存放各种算法的函数,假设该动态库是 ADLL,我在主程序中引入该动态库,这个动态库在主程序中也多处用到,并且有一个在主程序中也利用动态库中的函数创建了一套方法集合。现在我创建两个线程,这两个线程都用到了这套方法集合,而我引入的动态库是用指针形式引用的,那么,我在一个线程中更改指针的指向对象的值,怎么能在另外的一个线程中没有改变,有什么方法或者什么折中的方法没?rn 大概的示例代码如下:rn ADLL:是动态链接库。rn class __declspec( dllimport ) ADLL* pADLL; //主程序中引入rnrn 然后在主程序中的很多地方都用到了pADLL,rn 如:rn A()rn rn pADLL->.....rn rn B()rn rn pADLL->.....rn rn rn 然后创建两个线程:rn m_hThread1 = CreateThread( NULL, 0, SockThreadProc, rn this, 0, &m_dwThreadID1 );rnrn m_hThread2 = CreateThread( NULL, 0, SockThreadProc, rn this, 0, &m_dwThreadID2 );rn rnrnDWORD WINAPI CSRC_COMM_Local::SockThreadProc(LPVOID lpParam)rnrn A();rn B();rnrnrn 现在的问题是,怎么在线程1中更改pADLL的东西,在线程2中可以保持不变,有什么方法?
多个线程调用同一个全局函数,有没有问题???
多个线程调用同一个全局函数,有没有问题???多个线程调用同一个全局函数,有没有问题???多个线程调用同一个全局函数,有没有问题???
同一个线程不要调用2次Thread.start()
同一个线程,如果调用start()两次会报异常:Exception in thread &quot;main&quot; java.lang.IllegalThreadStateException 看源码: /* Java thread status for tools, * initialized to indicate thread 'not yet started' */ private volat...
安卓,调试时无法进入到run方法
安卓,调试时无法进入到run方法,但把该项目下生成的apk文件发送到手机并安装运行n是这样的,按下"主线程的消息"按钮,结果如下:n![图片说明](https://img-ask.csdn.net/upload/201702/19/1487455197_812710.png)n按下"从其他线程到主线程的消息"和"消息与其他线程运行从主线程的回调"按钮,结果n如下:n![图片说明](https://img-ask.csdn.net/upload/201702/19/1487455772_249075.png)n按下"消息到其他线程本身"按钮,结果如下:n![图片说明](https://img-ask.csdn.net/upload/201702/19/1487455715_41821.png)n求解释nEventHandler.javann```n package com.mytest.handlertest;nnimport android.content.Context;nimport android.os.Handler;nimport android.os.Looper;nimport android.os.Message;nimport android.util.Log;nimport android.widget.Toast;nclass EventHandler extends Handler nn private NoLooperThread noLooperThread;n private OwnLooperThread ownLooperThread;n private Context context;n public EventHandler(Context context,Looper looper) n n super(looper);n this.context=context;n n n public EventHandler() n n super(); n n n @Overriden public void handleMessage(Message msg) n super.handleMessage(msg);n Log.e("EventHandler", "当前线程id:------+>"+Thread.currentThread().getId());n Toast.makeText(context, "当前线程id:------+>"+Thread.currentThread().getId(), Toast.LENGTH_SHORT).show();n //可以根据msg.what执行不同的处理,这里没有这么做 nswitch(msg.what) ncase 1: nLog.e("EventHandler",(String)msg.obj);nbreak; ncase 2: n Log.e("EventHandler",(String)msg.obj);n Toast.makeText(context, (String)msg.obj, Toast.LENGTH_SHORT).show();n//noLooperThread.stop(); nbreak; ncase 3: n//不能在非主线程的线程里面更新UI,所以这里通过Log打印收到的消息 nLog.e("EventHandler", (String)msg.obj); n //ownLooperThread.stop(); nbreak; ndefault: n//不能在非主线程的线程里面更新UI,所以这里通过Log打印收到的消息 nLog.e("EventHandler", (String)msg.obj); nbreak; n n n nnn```nnHandlerTest.javannn```n package com.mytest.handlertest;nnimport android.app.Activity;nimport android.os.Bundle;nimport android.os.Handler;nimport android.os.Looper;nimport android.os.Message;nimport android.view.Menu;nimport android.view.MenuItem;nimport android.view.View;nimport android.view.View.OnClickListener;nimport android.widget.Button;nimport android.widget.TextView;nnpublic class HandlerTest extends Activity implements OnClickListener n private Button btn1,btn2,btn3,btn4,btn5,btn6;n private boolean postRunnable;n private EventHandler mHandler;n private NoLooperThread noLooperThread;n private OwnLooperThread ownLooperThread;n private Handler mOtherThreadHandler;n private TextView tv;n private ReceiveMessageThread receiveMessageThread;n @Overriden protected void onCreate(Bundle savedInstanceState) n super.onCreate(savedInstanceState);n setContentView(R.layout.activity_handler_test);n btn1=(Button)findViewById(R.id.b101);n btn2=(Button)findViewById(R.id.b102);n btn3=(Button)findViewById(R.id.b103);n btn4=(Button)findViewById(R.id.b104);n btn5=(Button)findViewById(R.id.b105);n btn6=(Button)findViewById(R.id.b106);n tv=(TextView)findViewById(R.id.tv1);n btn1.setOnClickListener(this);n btn2.setOnClickListener(this);n btn3.setOnClickListener(this);n btn4.setOnClickListener(this);n btn5.setOnClickListener(this);n btn6.setOnClickListener(this);n receiveMessageThread=new ReceiveMessageThread(this);n receiveMessageThread.start();n n n n @Override n public void onClick(View v) n switch(v.getId()) n case R.id.b101: n //主线程发送消息给自己 n Looper looper; n looper = Looper.myLooper(); //get the Main looper related with the main thread n //如果不给任何参数的话会用当前线程对应的Looper(这里就是Main Looper)为Handler里面的成员mLooper赋值 n mHandler = new EventHandler(this,looper); n //mHandler = new EventHandler(); n // 清除整个MessageQueue里的消息 n mHandler.removeMessages(0); n String obj = "This main thread's message and received by itself!"; n //得到Message对象 n Message m = mHandler.obtainMessage(2, 1, 1, obj); n // 将Message对象送入到main thread的MessageQueue里面 n mHandler.sendMessage(m); n break; n case R.id.b102: n //other线程发送消息给主线程 n postRunnable = false; n noLooperThread = new NoLooperThread(this); n noLooperThread.start(); n break; n case R.id.b103: n //other thread获取它自己发送的消息 n tv.setText("请看其他线程接收消息的错误级别日志"); n ownLooperThread = new OwnLooperThread(this); n ownLooperThread.start(); n break;n case R.id.b104: n //other thread通过Post Runnable方式发送消息给主线程 n postRunnable = true; n noLooperThread = new NoLooperThread(this); n noLooperThread.start(); n break; n case R.id.b105: n //主线程发送消息给other thread n if(null!=mOtherThreadHandler) n tv.setText("please look at the error level log for other thread received message from main thread"); n String msgObj = "message from mainThread"; n Message mainThreadMsg = mOtherThreadHandler.obtainMessage(1, 1, 1, msgObj); n mOtherThreadHandler.sendMessage(mainThreadMsg); n n break; n case R.id.b106: n finish(); n break; n n nnn @Overriden public boolean onCreateOptionsMenu(Menu menu) n // Inflate the menu; this adds items to the action bar if it is present.n getMenuInflater().inflate(R.menu.handler_test, menu);n return true;n nn @Overriden public boolean onOptionsItemSelected(MenuItem item) n // Handle action bar item clicks here. The action bar willn // automatically handle clicks on the Home/Up button, so longn // as you specify a parent activity in AndroidManifest.xml.n int id = item.getItemId();n if (id == R.id.action_settings) n return true;n n return super.onOptionsItemSelected(item);n nnn```nnNoLooperThread.javannn```n package com.mytest.handlertest;nnimport android.content.Context;nimport android.os.Looper;nimport android.os.Message;nimport android.util.Log;nimport android.widget.TextView;nimport android.widget.Toast;nnclass NoLooperThread extends Threadn private Context context;n private TextView tv;n private boolean postRunnable;n private EventHandler mNoLooperThreadHandler;n n public NoLooperThread(Context context)n n this.context=context;n n n public void run() n Looper myLooper, mainLooper; n myLooper = Looper.myLooper(); n mainLooper = Looper.getMainLooper(); //这是一个static函数 n String obj; n if(myLooper == null) n mNoLooperThreadHandler = new EventHandler(context,mainLooper); n obj = "NoLooperThread has no looper and handleMessage function executed in main thread!"; n n else n mNoLooperThreadHandler = new EventHandler(context,myLooper); n obj = "This is from NoLooperThread self and handleMessage function executed in NoLooperThread!"; n n //Toast.makeText(context, obj, Toast.LENGTH_SHORT).show();n mNoLooperThreadHandler.removeMessages(0); n if(false == postRunnable) n //send message to main thread n Message m = mNoLooperThreadHandler.obtainMessage(2, 1, 1, obj); n mNoLooperThreadHandler.sendMessage(m); n Log.e("NoLooperThread", "NoLooperThread id:" + this.getId()); n else n //下面new出来的实现了Runnable接口的对象中run函数是在Main Thread中执行,不是在NoLooperThread中执行 n //注意Runnable是一个接口,它里面的run函数被执行时不会再新建一个线程 n //您可以在run上加断点然后在eclipse调试中看它在哪个线程中执行 n mNoLooperThreadHandler.post(new Runnable() n @Override n public void run() n Log.e("NoLooperThread","update UI through handler post runnalbe mechanism!"); n // noLooerThread.stop(); n n ); n n n nn```nnOwnLooperThread.javannn```n package com.mytest.handlertest;nnimport android.content.Context;nimport android.os.Looper;nimport android.os.Message;nimport android.widget.Toast;nnclass OwnLooperThread extends Threadn private Context context;n private EventHandler mOwnLooperThreadHandler;n public OwnLooperThread(Context context)n n this.context=context;n n public void run() n Looper.prepare(); n Looper myLooper, mainLooper; n myLooper = Looper.myLooper(); n mainLooper = Looper.getMainLooper(); //这是一个static函数 n String obj; n if(myLooper == null) n mOwnLooperThreadHandler = new EventHandler(context,mainLooper); n obj = "OwnLooperThread has no looper and handleMessage function executed in main thread!"; n n else n mOwnLooperThreadHandler = new EventHandler(context,myLooper); n obj = "This is from OwnLooperThread self and handleMessage function executed in NoLooperThread!"; n n //Toast.makeText(context, obj, Toast.LENGTH_SHORT).show();n mOwnLooperThreadHandler.removeMessages(0); n //给自己发送消息 n Message m = mOwnLooperThreadHandler.obtainMessage(3, 1, 1, obj); n mOwnLooperThreadHandler.sendMessage(m); n Looper.loop(); n n n nn```nnReceiveMessageThread.javann```n package com.mytest.handlertest;nnimport android.content.Context;nimport android.os.Handler;nimport android.os.Looper;nimport android.os.Message;nimport android.util.Log;nimport android.widget.Toast;nnclass ReceiveMessageThread extends Threadn private Handler mOtherThreadHandler;n private Context context;n public ReceiveMessageThread(Context context)n n this.context=context;n n public void run() n Looper.prepare(); n mOtherThreadHandler = new Handler()n @Overriden public void handleMessage(Message msg) n super.handleMessage(msg);n Log.e("ReceiveMessageThread", (String)msg.obj);n Log.e("ReceiveMessageThread","当前线程id:----+>"+Thread.currentThread().getId());n // Toast.makeText(context, "当前线程id:----+>"+Thread.currentThread().getId(), Toast.LENGTH_SHORT).show();n n ; n Looper.loop(); n n n nn```nnnnnn
相关热词 c#入门推荐书 c# 解码海康数据流 c# xml的遍历循环 c# 取 查看源码没有的 c#解决高并发 委托 c#日期转化为字符串 c# 显示问号 c# 字典对象池 c#5.0 安装程序 c# 分页算法