诸多大神们对Thread说法不一,以至于刚毕业的我来说,实在是难以抉择。但我在学习了一番之后,个人觉得有必要做个记录了。
Thread的理解:不需要界面,默默的在后台做一些事情,尽量使用extends Thread来创建需要做持续性的或者需要频繁实现功能的线程。
先看图
效果图.gif代码:
1、Thread代码
public class MyThread2extends Thread {
private int count =0; //为了记录、显示线程的运行情况
private static MyThread2instance;
public static MyThread2getInstance() {
if (instance ==null) {
synchronized (MyThread2.class) {
instance =new MyThread2();
}
}
return instance;
}
public MyThread2() {
MyThreadManager.addThread(this);
setName(getClass().getSimpleName());
}
@Override
public void run() {
try {
while (!isInterrupted()) {
count++;
sendMsg("ID[" + getId() +"]正在运行中(" +count +")...");
Logger.i("正在运行中(" +count +")...");
sleep(2000);
}
}catch (InterruptedException e) {
Logger.e("@睡眠被打断" + e.getMessage());
sendMsg("线程" + getClass().getSimpleName() +"被中断");
}finally {
count =0;
}
}
@Override
public synchronized void start() {
try {
if(!isAlive()) {
super.start();
}else{
sendMsg(getClass().getSimpleName() +"已经在运行,且没有被打断");
}
}catch (Exception e) {
sendMsg(getClass().getSimpleName() +"启动失败[" + e.getMessage() +"]");
}
}
@Override
public void interrupt() {
super.interrupt();
instance=null;
}
private void sendMsg(String message) {
Intent intent =new Intent();
intent.setAction(MyThreadManager.BroadCast_Action);
JSONObject jsonObject =new JSONObject();
jsonObject.put("message", message);
jsonObject.put("index", 1);
intent.putExtra(MyThreadManager.BroadCast_Data_FLAG, jsonObject.toJSONString());
MyApp.getApp().sendBroadcast(intent);
}
}
这是其中一个Thread的写法,其他的跟他差不多。
2、activity代码:
启动线程:
MyThread1.getInstance().start();
停止线程:
if (!MyThread2.getInstance().isInterrupted())
{
MyThread2.getInstance().interrupt();
}
小结:我觉得这样用,我能通过start和interrupt来尝试启动或者终端该线程,满足了我的需求,特此记载!另外打断线程是在线程睡眠时才可以成功打断,如果线程正在执行某种操作,那么将无法打断,但等待其空闲下来,即可停止,且不必担心不能及时停止线程的问题,毕竟你写一个线程去故意长时间占用Cup是不科学的。因为stop方法被弃用,只能这样了。
重要说明:
①请支持原创,转载请注明出处。
②小白编程,不喜勿喷;如有错漏,望君海涵。
网友评论