实现线程的两种方式
来源:互联网 发布:多层嵌套 知乎 编辑:程序博客网 时间:2024/05/22 05:01
在Java中主要提供了两种方式实现线程,分别是继承java.lang.Thread类与实现java.lang.Runnable接口。
继承Thread类
Thread类是java.lang包中的一个类,从这个类中实例的对象代表线程,程序员启动一个线程需要建立Thread实例。
Thread类中常用的两个构造方法如下:
■ public Thread(String threadName)
■ public Thread()
其中第一个方法是创建一个名称为threadName对象。
继承Thread类创建一个新的线程
public class ThreadTest extends Thread{ //代码块}
完成 线程真正功能的代码放在类run()方法中,当一个类继承Thread类后,就可以在该类中覆盖run()方法,将实现该线程功能的代码写入run()方法中,然后同时调用Thread类中的start()方法执行线程,也就是调用run()方法。
Thread对象需要一个任务来执行,任务是指在启动时执行的工作,该工作的代码被写在run方法中。
public void run(){ //代码块 }
当执行一个程序时,就自动产生一个线程,主方法正是在这个线程上运行的。当不再启动其他线程时,该程序就为单线程程序。主方法线程启动由Java虚拟机负责,程序员负责启动自己的线程。
public static void main(String[] args){ //创建并运行线程 new ThreadTest().start();}
Demo
继承Thread实例
public class ThreadTest extends Thread { //继承Thread类 private int count=50; public void run(){ //重写run方法 while(true){ //打印我吃了几个苹果 System.out.println("我吃了第"+count+"个苹果"); //判断结束循环的条件 if(--count==0){ return; } } } public static void main(String[] args) { //两种方式任一即可 //第一种方式 ThreadTest tt=new ThreadTest(); tt.start(); //第二种方式 new ThreadTest().start(); }}
实现Runnable接口
Thread类的实质就是实现了Runnable接口,其中的run()方法正是对象Runnable接口中的Run()方法的具体实现。
到目前为止,线程都是通过扩展Thread类来创建的,如果我们需要继承其他类(非Thread类)并且该程序可以使用线程,就需要使用Runnable。例如,一个扩展JFrame的GUI程序不再继承Thread类,因为Java语言不支持多继承,这时该类就需要实现Runnable接口使其具有使用线程的功能。
实现Runnable接口
public class Thread extends Object implements Runnable{ //代码块 }
实现Runnable接口的程序会创建一个Thread对象,并将Runnable对象与Thread对象相关联。Thread类中有两个构造方法:
■ public Thread(Runnable r)
■ public Thread(Runnable r,String name)
这两个构造方法的参数中都存在Runnable实例,使用以上构造方法就可以将Runnable实例与Thread实例相关联。
使用Runnable接口启动新的线程的步骤如下:
(1)建立Runnable对象(2)使用参数为Runnable对象的构造方法创建Thread实例(3)调用start()方法启动线程。
通过Runnable接口创建线程时,首先要编写一个实现Runnable接口的类,然后实例化该类的对象,这样就建立了Runnable对象;接下来使用相应的构造方法创建Thread实例;最后使用该实例调用Thread类中的start()方法。
实现实例调用Runnable接口创建线程的流程
Demo:
import java.awt.Container;import java.net.URL;import java.util.Random;import javax.swing.*;import java.net.URL; public class SwingAndThread extends JFrame{ //声明了JLabel对象 private JLabel jl=new JLabel(); //声明线程对象 private static Thread t; //声明计数对象 private int count=0; //声明了一个容器 private Container container=getContentPane(); public SwingAndThread(){ //绝对定位窗体大小与位置 setBounds(300,200,250,100); //使窗体不使用任何布局管理器 container.setLayout(null); URL url=SwingAndThread.class.getResource("/picture/a.gif"); //实例化一个Icon Icon icon=new ImageIcon(url); //将图标放在标签中 jl.setIcon(icon); //设置图片在标签的最左方 jl.setHorizontalAlignment(SwingConstants.LEFT); //设置标签的位置与大小 jl.setBounds(10,10,200,50); jl.setOpaque(true); //定义匿名内部类,该类实现了Runnable接口 t=new Thread(new Runnable(){ public void run(){ //重写run()方法 while(count<=200){ //设置循环条件 jl.setBounds(count,10,200,50); //将标签的横坐标用变量表示 try { t.sleep(1000); //使用线程休眠1000毫秒 } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } count+=4; //使横坐标每次增加4 if(count==200){ //当图标到达标签的最右边时, 使其回到标签最左边。 count=10; } } } }); t.start(); //启动线程 container.add(jl); //将标签添加到容器中 setVisible(true); //使窗口可视 setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE); } public static void main(String args[]){ new SwingAndThread(); //实例化一个SwingAndThread对象 }}
- 线程-实现线程的两种方式
- 实现线程的两种方式
- 实现线程的两种方式
- 线程的两种不同实现方式
- 线程的两种实现方式
- 实现线程的两种方式
- java实现线程的两种方式
- Java实现线程的两种方式
- 实现线程的两种方式
- Java实现线程的两种方式
- java的两种线程实现方式
- 实现线程的两种方式
- 线程的两种实现方式。
- 实现线程的两种方式
- 2、线程实现的两种方式
- 线程实现两种方式
- 线程两种方式实现
- JAVA 实现线程的两种方式,举例,详解
- CMake3:添加一个库
- HDU 6070 Dirt Ratio
- FZU 1649 Prime number or not (大素数判定)
- Android调试与开发常用命令
- 又一次被抛弃,Java真的不行了吗?
- 实现线程的两种方式
- Kafka跨集群迁移方案MirrorMaker原理、使用以及性能调优实践
- [编程之美-11]把二元查找树变成为排序的双向链表
- Poj3301-—Texas Trip(三分)
- Java内部类整理
- C++常见问题
- 如何使用vector的reserve和resize方法
- eclipse中maven install提示编码GBK的不可映射字符
- Java集合类总结