首页 > 编程语言 > 详细

Android下Java多线程使用

时间:2020-06-15 09:13:45      阅读:46      评论:0      收藏:0      [点我收藏+]

一、线程创建

  1、直接创建,需要实现Runnable()接口

        Thread thread1 =new Thread(new Runnable() {

       @Override
                        public void run() {

        Log.i("test","线程执行");

       } 

 

        2、创建一个类,继承Thread

  (1)、 public class ThreadTest extends Thread {
    @Override
    public void run() {
   super.run();
   try{  
       
System.out.println("线程执行代码");
   } catch (InterruptedException e) {
e.printStackTrace();
}
}

(2)、需要使用时,实例化
   ThreadTest t1=new ThreadTest();
    t1.start();

       3、特殊线程;创建一个定时器Timer。这个java断承Thread的类

  public class HellowWorld {

  public static void main(String[] args) throws InterruptedException {
    NewtimerTask timerTask=new NewtimerTask();
    Timer timer=new Timer();
    timer.scheduleAtFixedRate(timerTask,new Date(),2000);

  }

  public static class NewtimerTask extends TimerTask {
    @Override
    public void run() {
      int i = 0;
      System.out.println("任务开始");
      while (i < 5) {
        i++;
        System.out.println("我是t1计算任务,结果等:" + i);
      }
      i=0;
      System.out.println("任务结束");
    }
  }
}

 

二、线程控制

    
t1.wait();//(暂停执行)让线程从运行态转换为阻塞态,同时还会释放线程的同步锁。

               //wait()方法执行后,t1进入等待状态,直到另一个线程调用此对象的notify()方法或notifyAll()方法,直到它可以重新获得监视器的所有权并恢复执行

下面测试,没有调用notify()时,t1暂停后无法取得执行权

public class HellowWorld {
final static Object object = new Object();

public static void main(String[] args) throws InterruptedException {
Thread t1 = new Thread(new Runnable() {
@Override
public void run() {
synchronized (object) {
try {
System.out.println("线程1开始运行");
object.wait();
System.out.println("线程1结束");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
});

Thread t2 = new Thread(new Runnable() {
@Override
public void run() {
synchronized (object) {
System.out.println("线程2开始运行");
try {
Thread.sleep(100);//保证t2没有结束前t1开始运行
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("线程2结束");
//object.notify();
}
}
});

t2.start();//开启线程2
t1.start();//开启线程1

}
}


//=======系统打印===========

线程1开始运行
线程2开始运行
线程2结束

----------------------------------------------------------------------

当t2中执行唤醒 object.notify();

//=======系统打印==========
线程1开始运行
线程2开始运行
线程2结束
线程1结束



t1.sleep(1000);//线程休眠(暂停执行)进入阻塞状态,会让线程交出CPU的执行权,下次事件循环需要竞争CPU的执行权

t1.yield();//(暂停执行)不会进入阻塞状态,而是进入可运行态,下次事件直接取到执行权

t1.join();//使该线程先执行完, 其他线程才可以执行

测试t1.join(),t1先执行,但是直到t2完成后,t1才结束

public class HellowWorld {
final static Object object = new Object();

public static void main(String[] args) throws InterruptedException {

Thread t1 = new Thread(new Runnable() {
@Override
public void run() {
System.out.println("线程1开始运行");
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("线程1结束");
}
});

Thread t2 = new Thread(new Runnable() {
@Override
public void run() {
System.out.println("线程2开始运行");
System.out.println("线程2结束");
}
});

t1.start();//开启线程1
t2.start();//开启线程2
t1.join();

}
}


//===========扫印输出=============

线程1开始运行
线程2开始运行
线程2结束
线程1结束



t1.interrupt();//中断线程,假如当前是在阻塞(sleep,wait,join)时间片中时,会抛出异常并把中断状态改成false

为了使用中断有效,网上介绍使用;两阶段中止模式;

就是在catch (InterruptedException e) {}中再次设置Thread.currentThread().interrupt()中断;

从而保证中断时会执行中断代码;

t1.isInterrupted();//

 

三、线程任务

 (1)、任务只是一段代码,那么实现了Runnabel的类的,都可以称为任务

public class HellowWorld {
final static Object object = new Object();

public static void main(String[] args) throws InterruptedException {

Thread t1 = new Thread(new NewTask());
t1.start();//开启线程1
}

public static class NewTask implements Runnable{
@Override
public void run() {
int i=0;
while (i<10) {
i++;
System.out.println("我是一个计算任务,结果等:" + i);
}
}
}
}

 (2)、每个线程指定一个任务,执行顺序由操作系统

public class HellowWorld {
final static Object object = new Object();

public static void main(String[] args) throws InterruptedException {

Thread t1 = new Thread(new NewTask());
t1.start();//开启线程1

Thread t2 = new Thread(new NewTask2());
t2.start();//开启线程1
}

public static class NewTask implements Runnable{
@Override
public void run() {
int i=0;
while (i<10) {
i++;
System.out.println("我是t1计算任务,结果等:" + i);
}
}
}

public static class NewTask2 implements Runnable{
@Override
public void run() {
int i=0;
while (i<10) {
i++;
System.out.println("我是t2计算任务,结果等:" + i);
}
}
}
}

//========打印结果=============

我是t2计算任务,结果等:1
我是t1计算任务,结果等:1
我是t2计算任务,结果等:2
我是t1计算任务,结果等:2
我是t1计算任务,结果等:3
我是t1计算任务,结果等:4
我是t1计算任务,结果等:5
我是t1计算任务,结果等:6
我是t1计算任务,结果等:7
我是t1计算任务,结果等:8
我是t1计算任务,结果等:9
我是t1计算任务,结果等:10
我是t2计算任务,结果等:3
我是t2计算任务,结果等:4
我是t2计算任务,结果等:5
我是t2计算任务,结果等:6
我是t2计算任务,结果等:7
我是t2计算任务,结果等:8
我是t2计算任务,结果等:9
我是t2计算任务,结果等:10

 

3、TimerTask定时任务,这个是java自带的任务,实现了Runnable

4、FutureTask这个任务与别的任务不同之处是可以返回任务执行完成的结果;

public class HellowWorld {

public static void main(String[] args) throws InterruptedException {
FutureTask futureTask = new FutureTask(new Taskable());

Thread t1=new Thread(futureTask);
t1.start();
try {
int backint=(int)futureTask.get();
System.out.println("任务返回值:"+backint);
} catch (ExecutionException e) {
e.printStackTrace();
}

}

public static class Taskable implements Callable {
@Override
public Object call() throws Exception {
int i = 1;
System.out.println("任务开始");
while (i < 5) {
i++;
System.out.println("我是t1计算任务,结果等:" + i);
}
return i;
}
}
}

//========打印结果=============

任务开始
我是t1计算任务,结果等:2
我是t1计算任务,结果等:3
我是t1计算任务,结果等:4
我是t1计算任务,结果等:5
任务返回值:5

 

四、线程池

public class  HellowWorld {
public static void main(String[] args) throws InterruptedException {
LinkedBlockingQueue<Runnable> ThreadQueue =new LinkedBlockingQueue<>(5);
ExecutorService executor = new ThreadPoolExecutor(1, 5, 100, TimeUnit.MILLISECONDS, ThreadQueue);
executor.execute(new Task(0));

//创建多任务
for (int i = 1; i < 10; i++) {
ThreadQueue.put(new Task(i));
System.out.println("队列"+i+"开始执行");

}
}

private static class Task implements Runnable{
int result;
public Task(int i) {
this.result=i;
}

@Override
public void run() {
System.out.println("任务"+result+"开始执行");
System.out.println("任务运行中...");
}
}

}

 

Android下Java多线程使用

原文:https://www.cnblogs.com/popsn/p/13128500.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!