黑马程序员—多线程技术

---------------------- ASP.Net+Android+IO开发S.Net培训、期待与您交流! ----------------------

多线程的问题

进程:是一个正在执行中的程序,每一个进程执行都有一个执行顺序。该顺序是一个执行路径,或者叫一个控制单元。。一个进程既包括其所要执行的指令,也包括了执行指令所需的系统资源,不同进程所占用的系统资源相对独立

 

线程:就是进程中的一个独立的控制单元。线程是进程中的一个实体,是被系统独立调度和分派的基本单位。线程自己基本上不拥有系统资源,但它可以与同属一个进程的其他线程共享进程所拥有的全部资源。线程在控制着进程的执行。一个进程中至少有一个线程。

Java VM  启动的时候会有一个进程java.exe.该进程中至少一个线程负责java程序的执行。而且这个线程运行的代码存在于main方法中,该线程称之为主线程。 

 

进程的创建方式有两种,一种是通过继承Thread,另一种是实现Runnable。

第一种方式:继承Thread类。

实现步骤:

1,定义类继承Thread。

2,复写Thread类中的run方法。

         目的:将自定义代码存储在run方法。让线程运行。

 

3,调用线程的start方法,

         该方法两个作用:启动线程,调用run方法。

 

class Test extends Thread

{

         Test(String str)

         {

                   super(str);

         }

         public void run()

         {

                   //线程运行代码

         }

 

}

 

class ThreadTest

{

         public static void main(String[] args)

         {

                   Test t1 = new Test("one---");

                   Test t2 = new Test("two+++");

                   t1.start();//启动线程,调用run方法

                   t2.start();

         }

}

 

在运行时,我们会发现每次的结果都不相同。因为多个线程都获取cpu的执行权。cpu执行到谁,谁就运行。明确一点,在某一个时刻,只能有一个程序在运行(多核除外)。

 

这就是多线程的一个特性:随机性。谁抢到谁执行,至于执行多长,cpu说的算。

 

 

 

为什么要覆盖run方法呢?

 

Thread类用于描述线程。

该类就定义了一个功能,用于存储线程要运行的代码。该存储功能就是run方法。

 

也就是说Thread类中的run方法,用于存储线程要运行的代码。

 

 

 

第二种方式:实现Runable接口

 

实现步骤:

1,定义类实现Runnable接口

2,覆盖Runnable接口中的run方法。

         将线程要运行的代码存放在该run方法中。

 

3,通过Thread类建立线程对象。

4,将Runnable接口的子类对象作为实际参数传递给Thread类的构造函数。

         为什么要将Runnable接口的子类对象传递给Thread的构造函数。

         因为,自定义的run方法所属的对象是Runnable接口的子类对象。

         所以要让线程去指定指定对象的run方法。就必须明确该run方法所属对象。

 

 

5,调用Thread类的start方法开启线程并调用Runnable接口子类的run方法。

 

 

class RunFunction implements Runnable//定义类实现Runnable接口

{

         public void run()  //覆盖Runnable接口中的run方法。

         {

                   //run方法代码

         }

}

 

 

class  RunFunctionDemo

{

         public static void main(String[] args)

         {

 

                   RunFunction r = new RunFunction();  //通过Thread类建立线程对象

 

                   Thread t1 = new Thread(r);//创建了一个线程;将Runnable接口的子类对象作为实际参数传递给Thread类的构造函数

                   Thread t2 = new Thread(r);//创建了一个线程;

                   //调用Thread类的start方法开启线程并调用Runnable接口子类的run方法

t1.start();

                   t2.start();

         }

}

 

---------------------- ASP.Net+Android+IO开发S.Net培训、期待与您交流! ----------------------
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值