java 多线程例子

进程和线程是计算机中的两个基本的执行单元。java的并发程序更关注的是线程。


进程

进程可以看做是一个程序或者一个应用,是包含运行环境的。但是,一个运行的程序本身是可以包含多个进程。java运行环境可以被看做是一个运行着多个不同的类和程序的进程的进程。


线程

每个java应用至少包含一个线——main方法。尽管后台运行着很多其他的线程,比如说内存管理、系统管理、信号处理等。但是,从应用的角度看,main方法是第一个进程,我们也可以在main方法里面创建多线程。

多线程是指一个程序同时运行着两个或两个以上的线程。一台单核但闹每次只能运行一个线程,时间片是用来实现不同的进程和线程之间相互切换的。

线程的优点

1.相对于进程,线程更加轻量级。线程比进程消耗更少的时间和资源。

2.线程可以共享福进程的数据和代码。

3.线程之间的上下文切换通常比进程之间的相互切换要节省。

4.线程之间的相互通信比进程之间的相互通信要简单方便得多。


java提供了两种创建线程的实现方式。

1.实现 java.lang.Runnable接口

2.继承java.lang.Thread类。


实现Runnable的java线程例子

为了让类编程runnable的,我们实现 java.lang.Runnable接口,这个接口提供了一个空返回的run()方法。为了刻个把类当做线程,我们需要通过运行这个类来创建一个Thread对象,然后调用start()方法在不同的线程中运行run()方法。


这里是一个简单的例子,旨在说明如何实现runnable接口。

HeavyWorkRunnable.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
package com.journaldev.threads;
 
public class HeavyWorkRunnable implements Runnable {
 
    @Override
    public void run() {
        System.out.println("Doing heavy processing - START "+Thread.currentThread().getName());
        try {
            Thread.sleep(1000);
            //Get database connection, delete unused data from DB
            doDBProcessing();
        catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("Doing heavy processing - END "+Thread.currentThread().getName());
    }
 
    private void doDBProcessing() throws InterruptedException {
        Thread.sleep(5000);
    }
继承Thread的java线程例子


我们通过继承java.lang.Thread类,重写run()方法创建我们自己的线程类。然后我们可以创建它的对象吗,再调用start()方法来运行自定义run()方法。

MyThread.java
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
package  com.journaldev.threads;
 
public  class  MyThread  extends  Thread {
 
     public  MyThread(String name) {
         super (name);
     }
 
     @Override
     public  void  run() {
         System.out.println( "MyThread - START " +Thread.currentThread().getName());
         try  {
             Thread.sleep( 1000 );
             //Get database connection, delete unused data from DB
             doDBProcessing();
         catch  (InterruptedException e) {
             e.printStackTrace();
         }
         System.out.println( "MyThread - END " +Thread.currentThread().getName());
     }
 
     private  void  doDBProcessing()  throws  InterruptedException {
         Thread.sleep( 5000 );
     }
     
}
下面的代码是说明如何运行多线程的。
ThreadRunExample.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
package  com.journaldev.threads;
 
public  class  ThreadRunExample {
 
     public  static  void  main(String[] args){
         Thread t1 =  new  Thread( new  HeavyWorkRunnable(),  "t1" );
         Thread t2 =  new  Thread( new  HeavyWorkRunnable(),  "t2" );
         System.out.println( "Starting Runnable threads" );
         t1.start();
         t2.start();
         System.out.println( "Runnable Threads has been started" );
         Thread t3 =  new  MyThread( "t3" );
         Thread t4 =  new  MyThread( "t4" );
         System.out.println( "Starting MyThreads" );
         t3.start();
         t4.start();
         System.out.println( "MyThreads has been started" );
         
     }
}

输出是:

Starting Runnable threads
Runnable Threads has been started
Doing heavy processing - START t1
Doing heavy processing - START t2
Starting MyThreads
MyThread - START Thread-0
MyThreads has been started
MyThread - START Thread-1
Doing heavy processing - END t2
MyThread - END Thread-1
MyThread - END Thread-0
Doing heavy processing - END t1




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值