- 浏览: 521738 次
- 性别:
- 来自: 杭州
-
文章分类
- 全部博客 (114)
- C基础 (1)
- C指针 (0)
- C语言库函数相关 (1)
- Linux (2)
- Linux网络编程 (1)
- PostgreSQL (0)
- Redis (2)
- Java Web (2)
- JAVA基础 (35)
- Ubuntu (8)
- Android (2)
- MySQL (3)
- 日志 (1)
- 书虫 (1)
- 数据结构 (0)
- 算法 (0)
- 开发工具 (1)
- 转载 (13)
- 英语 (18)
- tomcat启动脚本分析 (3)
- Oracle基础 (4)
- tomcat源码分析 (3)
- tomcat (1)
- Java相关 (1)
- Oracle基本原理--Oracle体系结构 (0)
- Oracle基本原理--表 (0)
- Oracle基本原理--索引 (0)
- Oracle基本原理--事务 (0)
- Oracle开发--SQL (1)
- Oracle基本原理--PL/SQL (0)
- Oracle基本原理--常用函数 (0)
- Oralce管理--用户及权限管理 (0)
- Oracle管理--安装调试 (0)
- Oracle管理--备份恢复 (0)
- Oralce管理--数据迁移 (0)
- Oracle管理--闪回 (0)
- Oracle管理--故障处理 (0)
- Oracle优化原理--统计信息 (0)
- Oracle优化原理--执行计划 (0)
- Oracle优化原理--诊断工具 (0)
- Oracle优化原理--深入理解表 (0)
- Oracle优化原理--深入理解索引 (0)
- Oracle优化原理--表连接原理 (0)
- Java--OOP (0)
- Java--异常 (0)
- Java--泛型 (0)
- Java--集合 (0)
- Java--IO (0)
- Java--枚举类型 (0)
- Java--注释 (0)
- Java--多线程 (0)
- Java--XML (0)
- Java--JDBC (3)
- Servlet (0)
- JSP (0)
- JSTL (0)
- 设计模式 (0)
- DAO与MVC (0)
- Javascript (2)
- Ajax (0)
- JQuery (0)
- HTML/CSS (0)
- 前端相关 (1)
- HTTP (0)
- TCP/IP (0)
- GO基础 (0)
最新评论
-
jsonmong:
推荐一个开发平台,采用的是插件化的设计思想,效果很不错的。ht ...
构建Java Web开发环境 -
wxm198427:
首先表示辛苦了!我想问个问题:我的是windows 7 x64 ...
Oracle 11g R2 for Win7旗舰版(64位)的安装步骤 -
握着橄榄枝的人:
我之前按照你的update mysql.user set pa ...
Windows7下MySQL5.5.20免安装版的配置 -
confident_f:
安装了32的客户端后,用plsql导入导出表有问题,生成不了d ...
Oracle 11g R2 for Win7旗舰版(64位)的安装步骤 -
confident_f:
安装数据库的时候第9步卡住了 是怎么回事呢?
Oracle 11g R2 for Win7旗舰版(64位)的安装步骤
在Java中创建线程有两种方法:继承Thread类和实现Runnable接口。
一、继承Thread类创建线程类(Thread类已经实现了Runnable接口)
1、Thread类的构造方法有8个,但常用的只有4个,分别为:
Thread类中的两个最主要的方法:
(1)run()—包含线程运行时所执行的代码,即线程需要完成的任务,是线程执行体。
(2)start()—用于启动线程。
2、通过继承Thread类来创建并启动多线程的步骤:
(1)定义Thread类的子类,并覆盖该类的run()方法。
(2)创建Thread子类的实例,即创建线程对象。
(3)用线程对象的start()方法来启动该线程。
例程1:
程序的运行结果如下:
main
Thread-0
Thread-1
注意:程序中两条线程并发执行时,每次的执行结果是会变化的。这是因为,如果多个没有同步约束关系的线程并发执行时,调度线程将不能保证哪个线程先执行及其持续的时间,在不同平台上,或在同一平台上不同时刻的多次运行可能会得到不同的结果。
Java中对于线程启动后唯一的能够保障的就是:“每个线程都将启动,每个线程都会执行结束”。但谁会先执行谁会后执行,将没有保障,也就是说,就算一个线程在另一个线程之前启动,也无法保障该线程一定在另一个线程之前执行完毕。
程序分析如下:
(1)任何一个Java程序都必须有一个主线程。主线程的线程执行体不是由run()方法来确定的,而是由main()方法来确定的:main()方法的方法体代表主线程的线程执行体。
(1)上面程序用到线程的两个方法:
Thread.currentThread():currentThread()是Thread类的静态方法,该方法总是返回当前正在执行的线程对象的引用。
getName():该方法是Thread类的实例方法,该方法返回调用该方法的线程的名字。
(3)程序可以通过setName(String name)方法为线程设置名字,也可以通过getName()方法返回指定线程的名字。在默认情况下,主线程的名字为main,用户启动的多条线程的名字依次为:Thread-0、Thread-1、Thread-2、……、Thread-n等。
(4)一个线程只能被启动一次。否则会抛出java.lang.IllegalThreadStateException异常。
例程2:
程序的运行结果如下:
thread1:MyThread1
thread2:MyThread2
thread3:Thread-1
结果分析:
thread1通过调用了Thread类的public Thread(String name)构造方法来设置线程名称。
thread2通过setName()方法来修改线程名称。
thread3未设置线程名称。
注意:在调用start方法前后都可以使用setName()方法设置线程名,但在调用start()方法后使用setName()修改线程名称,会产生不确定性,也就是说可能在run()方法执行完后才会去执行setName()方法,此时,如果在run方法中要使用线程名,就会出现虽然调用了setName()方法,但线程名称却未修改的现象。
例程3:
程序的运行结果如下:
Thread-0:0
Thread-0:1
Thread-1:0
Thread-0:2
Thread-0:3
Thread-0:4
Thread-1:1
Thread-0:5
Thread-0:6
Thread-1:2
Thread-0:7
Thread-1:3
Thread-0:8
Thread-1:4
Thread-0:9
Thread-1:5
Thread-1:6
Thread-1:7
Thread-1:8
Thread-1:9
例程4:
程序的运行结果如下:
main:0
main:1
main:2
main:3
main:4
main:5
Thread-0:0
Thread-0:1
Thread-0:2
Thread-1:0
main:6
main:7
Thread-1:1
Thread-1:2
Thread-0:3
Thread-1:3
main:8
Thread-1:4
Thread-0:4
Thread-0:5
Thread-1:5
main:9
Thread-1:6
Thread-1:7
Thread-0:6
Thread-1:8
Thread-0:7
Thread-1:9
Thread-0:8
Thread-0:9
结果分析:
从以上结果可以看出:Thread-0和Thread-1两条线程各自都会输出的i变量,比如存在Thread-0:5和Thread-1:5,因为i是FirstThread类的实例变量,而不是局部变量,而每次创建线程对象都需要创建一个FirstThread对象,所以Thread-0和Thread-1不能共享该实例属性。因而可以得出以下结论:使用继承Thread类的方法来创建线程类,多条线程之间无法共享线程类的实例变量。
二、实现Runnable接口创建线程类
实现Runnable接口的类必须使用Thread类的实例才能创建线程。通过实现Runnable接口来创建并启动多线程的步骤:
(1)定义Runnable接口的实现类,并实现该接口的run()方法。
(2)创建Runnable实现类的实例,然后将该实例作为参数传入Thread类的构造方法来创建Thread对象。
(3)用线程对象的start()方法来启动该线程。
例程5:
程序的运行结果如下:
MyThread1
MyThread2
Thread-1
当然,实现Runnable接口的类的对象可以被同时传给多个线程对象。上述程序修改如下:
运行的结果是类似的。
例程6:
程序的运行结果如下:
Thread-0:0
Thread-1:0
Thread-1:1
Thread-0:1
Thread-1:2
Thread-0:2
Thread-1:3
Thread-1:4
Thread-1:5
Thread-0:3
Thread-1:6
Thread-0:4
Thread-1:7
Thread-0:5
Thread-1:8
Thread-0:6
Thread-1:9
Thread-0:7
Thread-0:8
Thread-0:9
例程7:
程序的运行结果如下:
main:0
main:1
main:2
main:3
main:4
main:5
main:6
main:7
新线程2:0
新线程1:0
新线程2:1
main:8
新线程2:3
新线程1:2
新线程2:4
main:9
新线程2:6
新线程2:7
新线程1:5
新线程2:8
新线程1:9
结果分析:
从以上结果可以看出:新线程1和新线程2共享一个SecondThread对象,因此在执行run()方法时两个线程对象操纵的是同一个实例变量i。所以在执行输出的变量i的值是惟一的,例如新线程2:3、新线程1:2、新线程2:4,不会再出现新线程1:3或者新线程2:1等,且i值在逻辑上也是连续的,即i会从1到9由新线程1和新线程2交替惟一地输出,而实际顺序会不连续。因而可以得出以下结:采用实现Runnable接口的方法来创建线程类,多条线程可以共享同一个线程类(Runnable接口的实现类即target类)的实例属性。
注意:在使用继承Thread类时获得当前线程对象直接使用this就可以了,但是实现Runnable接口时要获得当前线程对象必须使用Thread.currentThread()方法。
若对上述程序作如下修改:
程序的运行结果如下:
main:0
main:1
main:2
main:3
main:4
main:5
main:6
main:7
新线程1:0
新线程2:0
新线程2:1
新线程1:1
main:8
main:9
新线程1:2
新线程1:3
新线程1:4
新线程2:2
新线程1:5
新线程2:3
新线程1:6
新线程2:4
新线程1:7
新线程2:5
新线程1:8
新线程2:6
新线程1:9
新线程2:7
新线程2:8
新线程2:9
结果分析:
从以上结果可以看出:新线程1和新线程2分别操纵不同的SecondThread对象的实例变量。
记住:Thread类本身也实现了Runnable接口,因此Thread类及其子类的对象也可以作为target传递给新的线程对象。
三、两种创建线程方式的比较
采用继承Thread类方式:
(1)优点:编写简单,如果需要访问当前线程,无需使用Thread.currentThread()方法,直接使用this,即可获得当前线程。
(2)缺点:因为线程类已经继承了Thread类,所以不能再继承其他的父类。
采用实现Runnable接口方式:
(1)优点:线程类只是实现了Runable接口,还可以继承其他的类。在这种方式下,可以多个线程共享同一个目标(target)对象,所以非常适合多个相同线程来处理同一份资源的情况,从而可以将CPU代码和数据分开,形成清晰的模型,较好地体现了面向对象的思想。
(2)缺点:编程稍微复杂,如果需要访问当前线程,必须使用Thread.currentThread()方法。
提示:在实际开发中,一般采用实现Runnable接口的方式来创建线程类,因为它具有更好的灵活性和可扩展性。
一、继承Thread类创建线程类(Thread类已经实现了Runnable接口)
1、Thread类的构造方法有8个,但常用的只有4个,分别为:

Thread类中的两个最主要的方法:
(1)run()—包含线程运行时所执行的代码,即线程需要完成的任务,是线程执行体。
(2)start()—用于启动线程。
2、通过继承Thread类来创建并启动多线程的步骤:
(1)定义Thread类的子类,并覆盖该类的run()方法。
(2)创建Thread子类的实例,即创建线程对象。
(3)用线程对象的start()方法来启动该线程。
例程1:
public class Thread1 extends Thread{ public void run(){ System.out.println(this.getName()); } public static void main(String args[]){ System.out.println(Thread.currentThread().getName()); Thread1 thread1 = new Thread1(); Thread1 thread2 = new Thread1(); thread1.start(); thread2.start(); } }
程序的运行结果如下:
main
Thread-0
Thread-1
注意:程序中两条线程并发执行时,每次的执行结果是会变化的。这是因为,如果多个没有同步约束关系的线程并发执行时,调度线程将不能保证哪个线程先执行及其持续的时间,在不同平台上,或在同一平台上不同时刻的多次运行可能会得到不同的结果。
Java中对于线程启动后唯一的能够保障的就是:“每个线程都将启动,每个线程都会执行结束”。但谁会先执行谁会后执行,将没有保障,也就是说,就算一个线程在另一个线程之前启动,也无法保障该线程一定在另一个线程之前执行完毕。
程序分析如下:
(1)任何一个Java程序都必须有一个主线程。主线程的线程执行体不是由run()方法来确定的,而是由main()方法来确定的:main()方法的方法体代表主线程的线程执行体。
(1)上面程序用到线程的两个方法:
Thread.currentThread():currentThread()是Thread类的静态方法,该方法总是返回当前正在执行的线程对象的引用。
getName():该方法是Thread类的实例方法,该方法返回调用该方法的线程的名字。
(3)程序可以通过setName(String name)方法为线程设置名字,也可以通过getName()方法返回指定线程的名字。在默认情况下,主线程的名字为main,用户启动的多条线程的名字依次为:Thread-0、Thread-1、Thread-2、……、Thread-n等。
(4)一个线程只能被启动一次。否则会抛出java.lang.IllegalThreadStateException异常。
例程2:
public class Thread2 extends Thread{ private String who; public void run(){ System.out.println(who+":"+this.getName()); } public Thread2(String who){ super(); this.who = who; } public Thread2(String who,String name){ super(name); this.who = who; } public static void main(String args[]){ Thread2 thread1 = new Thread2("thread1","MyThread1"); Thread2 thread2 = new Thread2("thread2"); Thread2 thread3 = new Thread2("thread3"); thread2.setName("MyThread2"); thread1.start(); thread2.start(); thread3.start(); } }
程序的运行结果如下:
thread1:MyThread1
thread2:MyThread2
thread3:Thread-1
结果分析:
thread1通过调用了Thread类的public Thread(String name)构造方法来设置线程名称。
thread2通过setName()方法来修改线程名称。
thread3未设置线程名称。
注意:在调用start方法前后都可以使用setName()方法设置线程名,但在调用start()方法后使用setName()修改线程名称,会产生不确定性,也就是说可能在run()方法执行完后才会去执行setName()方法,此时,如果在run方法中要使用线程名,就会出现虽然调用了setName()方法,但线程名称却未修改的现象。
例程3:
public class TestThread1{ public static void main(String args[]){ Thread t1 = new Thread3(); Thread t2 = new Thread3(); t1.start(); t2.start(); } } class Thread3 extends Thread{ public void run(){ for(int i=0;i<10;i++){ System.out.println(this.getName()+":"+i); } } }
程序的运行结果如下:
Thread-0:0
Thread-0:1
Thread-1:0
Thread-0:2
Thread-0:3
Thread-0:4
Thread-1:1
Thread-0:5
Thread-0:6
Thread-1:2
Thread-0:7
Thread-1:3
Thread-0:8
Thread-1:4
Thread-0:9
Thread-1:5
Thread-1:6
Thread-1:7
Thread-1:8
Thread-1:9
例程4:
public class FirstThread extends Thread{ private int i; public void run(){ for(;i<10;i++){ System.out.println(this.getName()+":"+i); } } public static void main(String args[]){ for(int i=0;i<10;i++){ System.out.println(Thread.currentThread().getName()+":"+i); if(i==5){ new FirstThread().start(); new FirstThread().start(); } } } }
程序的运行结果如下:
main:0
main:1
main:2
main:3
main:4
main:5
Thread-0:0
Thread-0:1
Thread-0:2
Thread-1:0
main:6
main:7
Thread-1:1
Thread-1:2
Thread-0:3
Thread-1:3
main:8
Thread-1:4
Thread-0:4
Thread-0:5
Thread-1:5
main:9
Thread-1:6
Thread-1:7
Thread-0:6
Thread-1:8
Thread-0:7
Thread-1:9
Thread-0:8
Thread-0:9
结果分析:
从以上结果可以看出:Thread-0和Thread-1两条线程各自都会输出的i变量,比如存在Thread-0:5和Thread-1:5,因为i是FirstThread类的实例变量,而不是局部变量,而每次创建线程对象都需要创建一个FirstThread对象,所以Thread-0和Thread-1不能共享该实例属性。因而可以得出以下结论:使用继承Thread类的方法来创建线程类,多条线程之间无法共享线程类的实例变量。
二、实现Runnable接口创建线程类
实现Runnable接口的类必须使用Thread类的实例才能创建线程。通过实现Runnable接口来创建并启动多线程的步骤:
(1)定义Runnable接口的实现类,并实现该接口的run()方法。
(2)创建Runnable实现类的实例,然后将该实例作为参数传入Thread类的构造方法来创建Thread对象。
(3)用线程对象的start()方法来启动该线程。
例程5:
public class MyRunnable implements Runnable{ public void run(){ System.out.println(Thread.currentThread().getName()); } public static void main(String args[]){ MyRunnable r1 = new MyRunnable(); MyRunnable r2 = new MyRunnable(); MyRunnable r3 = new MyRunnable(); Thread thread1 = new Thread(r1,"MyThread1"); Thread thread2 = new Thread(r2); thread2.setName("MyThread2"); Thread thread3 = new Thread(r3); thread1.start(); thread2.start(); thread3.start(); } }
程序的运行结果如下:
MyThread1
MyThread2
Thread-1
当然,实现Runnable接口的类的对象可以被同时传给多个线程对象。上述程序修改如下:
MyRunnable r1 = new MyRunnable(); Thread thread1 = new Thread(r1,"MyThread1"); Thread thread2 = new Thread(r1); thread2.setName("MyThread2"); Thread thread3 = new Thread(r1); thread1.start(); thread2.start(); thread3.start();
运行的结果是类似的。
例程6:
public class TestThread2{ public static void main(String args[]){ Runnable1 r1 = new Runnable1(); Thread t1 = new Thread(r1); Thread t2 = new Thread(r1); t1.start(); t2.start(); } } class Runnable1 implements Runnable{ public void run(){ for(int i=0;i<10;i++){ System.out.println(Thread.currentThread().getName()+":"+i); } } }
程序的运行结果如下:
Thread-0:0
Thread-1:0
Thread-1:1
Thread-0:1
Thread-1:2
Thread-0:2
Thread-1:3
Thread-1:4
Thread-1:5
Thread-0:3
Thread-1:6
Thread-0:4
Thread-1:7
Thread-0:5
Thread-1:8
Thread-0:6
Thread-1:9
Thread-0:7
Thread-0:8
Thread-0:9
例程7:
public class SecondThread implements Runnable{ private int i; public void run(){ for(;i<10;i++){ System.out.println(Thread.currentThread().getName()+":"+i); } } public static void main(String args[]){ for(int i=0;i<10;i++){ System.out.println(Thread.currentThread().getName()+":"+i); if(i==5){ SecondThread st = new SecondThread(); new Thread(st,"新线程1").start(); new Thread(st,"新线程2").start(); } } }
程序的运行结果如下:
main:0
main:1
main:2
main:3
main:4
main:5
main:6
main:7
新线程2:0
新线程1:0
新线程2:1
main:8
新线程2:3
新线程1:2
新线程2:4
main:9
新线程2:6
新线程2:7
新线程1:5
新线程2:8
新线程1:9
结果分析:
从以上结果可以看出:新线程1和新线程2共享一个SecondThread对象,因此在执行run()方法时两个线程对象操纵的是同一个实例变量i。所以在执行输出的变量i的值是惟一的,例如新线程2:3、新线程1:2、新线程2:4,不会再出现新线程1:3或者新线程2:1等,且i值在逻辑上也是连续的,即i会从1到9由新线程1和新线程2交替惟一地输出,而实际顺序会不连续。因而可以得出以下结:采用实现Runnable接口的方法来创建线程类,多条线程可以共享同一个线程类(Runnable接口的实现类即target类)的实例属性。
注意:在使用继承Thread类时获得当前线程对象直接使用this就可以了,但是实现Runnable接口时要获得当前线程对象必须使用Thread.currentThread()方法。
若对上述程序作如下修改:
SecondThread st1 = new SecondThread(); SecondThread st2 = new SecondThread(); new Thread(st1,"新线程1").start(); new Thread(st2,"新线程2").start();
程序的运行结果如下:
main:0
main:1
main:2
main:3
main:4
main:5
main:6
main:7
新线程1:0
新线程2:0
新线程2:1
新线程1:1
main:8
main:9
新线程1:2
新线程1:3
新线程1:4
新线程2:2
新线程1:5
新线程2:3
新线程1:6
新线程2:4
新线程1:7
新线程2:5
新线程1:8
新线程2:6
新线程1:9
新线程2:7
新线程2:8
新线程2:9
结果分析:
从以上结果可以看出:新线程1和新线程2分别操纵不同的SecondThread对象的实例变量。
记住:Thread类本身也实现了Runnable接口,因此Thread类及其子类的对象也可以作为target传递给新的线程对象。
三、两种创建线程方式的比较
采用继承Thread类方式:
(1)优点:编写简单,如果需要访问当前线程,无需使用Thread.currentThread()方法,直接使用this,即可获得当前线程。
(2)缺点:因为线程类已经继承了Thread类,所以不能再继承其他的父类。
采用实现Runnable接口方式:
(1)优点:线程类只是实现了Runable接口,还可以继承其他的类。在这种方式下,可以多个线程共享同一个目标(target)对象,所以非常适合多个相同线程来处理同一份资源的情况,从而可以将CPU代码和数据分开,形成清晰的模型,较好地体现了面向对象的思想。
(2)缺点:编程稍微复杂,如果需要访问当前线程,必须使用Thread.currentThread()方法。
提示:在实际开发中,一般采用实现Runnable接口的方式来创建线程类,因为它具有更好的灵活性和可扩展性。
发表评论
-
foreach循环
2013-06-24 16:15 1495从JDK1.5开始,Java提供了一个更简单的循环:forea ... -
可变参数
2013-06-24 15:38 1224从JDK1.5开始,Java允许使用可变参数为方法指定数量不确 ... -
泛型(core java 笔记)
2013-06-18 16:18 20741.为什么引入泛型 package generic; ... -
两个程序的说明
2010-10-19 09:26 11661、程序1的结果是: clas ... -
构造器初始化
2010-10-18 14:42 1535可以用构造器来进行初始化。在运行时刻,可以调用方法或执行某些动 ... -
成员初始化
2010-10-18 07:55 1247Java尽力保证:所有变量在使用前都能得到恰当的初始化。 对 ... -
线程的死锁
2010-10-11 19:21 1523当两个线程相互等待对方释放同步监视器时就会发生死锁,Java虚 ... -
线程的同步
2010-10-11 19:00 1290一个经典的关于线程安全性的问题:银行取钱问题。 银行取钱的基 ... -
java网站收集
2010-10-10 18:13 1295JAVA开发者最常去的25个英文网站:http://www.i ... -
控制线程
2010-10-10 16:06 20261、线程睡眠:sleep 如果我们需要让当前正在执行的线程暂 ... -
线程的状态
2010-09-28 19:00 1077线程从创建到执行完毕的整个过程称为线程的生命周期,在整个生命周 ... -
Java中Thread类的start()和run()的区别
2010-09-27 15:33 41381、start()方法来启动线程,真正实现了多线程运行,这时无 ... -
创建String对象过程的内存分配小结
2010-09-23 20:32 2795常量池(Constant Pool):指的是在编译期被确定,并 ... -
Java堆和栈的区别 经典总结(转载)
2010-09-18 16:48 1289栈与堆都是Java用来在Ram中存放数据的地方。 与C++不 ... -
Java初学者都必须理解的七大问题
2010-09-18 10:36 1132问题一:我声明了什么 ... -
关于计算java程序运行时间(转载)
2010-09-18 09:22 1136//第一种,伪代码 long startTime= ... -
for循环的优化
2010-09-17 20:29 2158在程序中经常用到for循环,当一些算法实时性要求非常高时,对f ... -
详细解析Java中抽象类和接口的区别(转载)
2010-09-17 10:16 1127在Java语言中,abstract class和inter ... -
集合类(四):Map集合
2010-09-16 20:26 21555、Map集合 Map集合为映射类型,映射与集和列表有明显的区 ... -
集合类(三):Set集合
2010-09-16 19:43 29264、Set集合 Set集合为集类型,集是最简单的一种集合,存放 ...
相关推荐
Java提供了两种主要的方法来创建线程,分别是直接继承自`Thread`类和实现`Runnable`接口。这两种方法各有其特点和适用场景。 1. **继承Thread类**: 当你选择继承`Thread`类时,你需要创建一个新的类,该类直接...
Java提供了多种创建线程的方式,其中最常见的是通过继承`Thread`类和实现`Runnable`接口这两种方法。下面将详细阐述这两种创建线程的方法及其区别。 ### 一、通过继承`Thread`类创建线程 当一个类继承了`Thread`类...
### 在Java中创建线程的两种方法 #### 一、概述 在Java中,创建线程主要有两种方式:一种是通过继承`Thread`类来实现;另一种是通过实现`Runnable`接口来完成。这两种方法都能有效地创建并启动线程,但它们各自的...
在Java中,创建和使用线程主要有两种方式,一种是继承Thread类,另一种是实现Runnable接口。这两种方式在使用上有一些区别,每种方式都有其特定的用法和特点。 首先,继承Thread类的方式。通过继承Thread类来创建...
本篇文章将深入探讨Java中创建线程的几种方法,以及如何通过示例源代码进行学习。 首先,Java提供了两种主要的方式来创建线程: 1. **继承Thread类**:创建一个新的类,该类继承自`Thread`类,并重写`run()`方法。...
Java 中创建线程有两种方法:继承 Thread 类和实现 Runnable 接口。这两种方法的实现机制不同,导致了不同的线程行为。本文将通过实例代码对这两种方法进行比较和分析,帮助读者更好地理解 Java 中的线程创建机制。 ...
Java 创建子线程的两种方法是 Java 编程中非常重要的知识点。创建子线程的两种方法主要介绍了 Java 创建子线程的两种方法,通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值。 一、继承 ...
首先,Java中创建线程主要有两种方法。一种是通过继承Thread类,重写其run()方法,然后实例化并调用start()方法启动线程。例如: ```java class MyThread extends Thread { @Override public void run() { // ...
在Java中,有两种主要的实现多线程的方式:通过`Thread`类和通过实现`Runnable`接口。 1. **通过`Thread`类实现多线程** 当我们创建一个`Thread`类的子类时,可以重写`run()`方法来定义线程执行的任务。例如: ``...
在JNI中回调Java方法主要有两种方式: 1. **使用JNIEnv**:JNIEnv是一个指向一系列函数指针的结构体,它提供了在本地代码中调用Java方法的接口。当JNI函数被Java方法调用时,JNIEnv会被自动传入。但是,如果在本地...
在Java中,可以通过两种方式创建线程:继承`Thread`类或实现`Runnable`接口。继承`Thread`类时,重写`run()`方法,然后通过`start()`方法启动线程。实现`Runnable`接口则需要创建一个实现了`run()`方法的类,并将...
本篇将详细讲解Java中实现多线程的两种主要方法:继承Thread类和实现Runnable接口。 ### 继承Thread类 1. **创建子类**:首先,我们需要创建一个新的类,该类继承自Java的`Thread`类。这样,我们的类就拥有了`...
在Java中创建线程主要有两种方式: 1. 继承Thread类:自定义一个新的类,继承自Thread类,重写run()方法,然后创建该类的实例并调用start()方法启动线程。 2. 实现Runnable接口:创建一个实现了Runnable接口的类,...
Java 中的多线程编程实现方式 Java 语言提供了多种方式来实现多线程编程,今天我们将讨论其中的两种实现方式,...本文介绍了 Java 语言中多线程编程的两种实现方式,并使用四个线程来演示对变量 J 的加一和减一操作。
在Java中,实现多线程有两种主要方式:继承Thread类和实现Runnable接口。 1. 继承Thread类: 当我们创建一个新的类,让它继承Thread类时,可以通过重写`run()`方法来定义线程执行的任务。然后创建该类的对象,并...
标题提到的"创建线程的两种方法"指的是使用`Thread`类和实现`Runnable`接口。这两种方法都是Java中实现多线程的重要手段,各有特点和适用场景。下面我们将详细探讨这两种方法。 **1. 继承Thread类** 当一个类继承...
Java提供了两种主要的方式来创建线程,分别是继承`Thread`类和实现`Runnable`接口。这两种方式各有优缺点,适用于不同的场景。 ### 继承Thread类 当你选择继承`Thread`类来创建线程,你需要按照以下步骤操作: 1....
创建一个新线程通常有两种方式:继承Thread类并重写run()方法,或者实现Runnable接口并提供run()方法。在run()方法中编写线程执行的代码。 进度条通常由主线程负责显示,而耗时任务则在一个或多个工作线程中执行。...
在Java中创建线程主要有两种方式:继承`Thread`类或者实现`Runnable`接口。在这个场景下,我们可能创建了两个类,一个是`WriterThread`用于写入成绩,另一个是`ReaderThread`用于读取并显示成绩。 在写入线程(`...
在Java中,创建线程有两种主要方式:继承`Thread`类或实现`Runnable`接口。这里,我们假设`Thread.java`中定义了一个名为`MyThread`的类,它直接继承自`Thread`: ```java public class MyThread extends Thread { ...