-
2020-07-21 09:40:15
两个线程轮流打印数字,一直到100
创建一个类,定义两个静态全局变量:
static int num=1; static Integer in=new Integer(1);
让这个类继承Thread类
重写Thread类里面的run()方法
因为使用两个线程,为了防止数据重复,使用同步synchronized。@Override public void run() { while (true){ synchronized (in){ if (num>100){ System.exit(0); }else { System.out.println(num); num++; } } } }
创建main()方法
声明两个线程,分别调用start()方法public static void main(String[] args) { Demo1 d1=new Demo1(); d1.start(); Demo1 d2=new Demo1(); d2.start(); }
执行结果:
更多相关内容 -
Java 创建两个线程模拟对话并交替输出实现解析
2020-08-25 13:34:39主要介绍了Java 创建两个线程模拟对话并交替输出实现解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 -
java多线程学习(两)——创建一个线程
2021-02-26 10:01:09一个、java创建两个线程的方法1、从java.lang.Thread派生一个新类线程类,其覆盖run()方法2、实现Runnable接口。重载Runnable接口中的run()方法。使用Thread类来创建线程和创建普通类的对象的操作是一样的,线程是...一个、java创建两个线程的方法
1、从java.lang.Thread派生一个新类线程类,其覆盖run()方法
2、实现Runnable接口。重载Runnable接口中的run()方法。
使用Thread类来创建线程和创建普通类的对象的操作是一样的,线程是Thread类或者其子类的实例对象。
二、java提供的两种创建线程的差别
java中类是单继承的,当定义一个新的线程类的时候。它仅仅能扩展一个外部类。那么当创建的线程是继承自Thread类来实现的,那么此线程类无法再扩展其它类,无法实现复杂的功能。此时,自己定义的线程类假设要扩展其它类,那么能够实现Runnable接口来实现线程类的功能,同一时候又能够扩展其它外部类。避免单继承带来的局限性。
同一时候。实现Runnable接口的方式创建的线程能够处理同一资源,从而实现资源的共享。
三、线程的创建
(1)由Thread类派生
由Thread派生出来的线程类。直接new就可以。
比如:
package com.thread.demo;
public class JavaThreadDemo {
/**
* @param args
*/
public static void main(String[] args) {
MutliThread m1 = new MutliThread("window 1");
MutliThread m2 = new MutliThread("window 2");
MutliThread m3 = new MutliThread("window 3");
m1.start();
m2.start();
m3.start();
}
}
class MutliThread extends Thread {
private int ticket = 100;
MutliThread(String name) {
super(name);
}
public void run() {
while(ticket > 0) {
ticket--;
System.out.println(ticket +" is saled by " + Thread.currentThread().getName());
}
}
}上面的样例中由Thread类派生出的MutliThread类,在main()方法中new了三个线程类,并调用线程类的start方法来执行线程。三个线程并发的执行。
有输出结果能够看出。
(2)实现Runnable接口
创建的类假设实现了Runnable接口,则须要使用Thread的构造方法来创建线程。
比如:package com.thread.demo;
public class JavaThreadDemo {
/**
* @param args
*/
public static void main(String[] args) {
TestRunnable test1 = new TestRunnable("张三");
TestRunnable test2 = new TestRunnable("李四");
Thread t1 = new Thread(test1);
Thread t2 = new Thread(test2);
t1.start();
t2.start();
}
}
class TestRunnable implements Runnable {
private String name;
TestRunnable(String name) {
this.name = name;
}
@Override
public void run() {
for(int i = 0; i < 5; i++) {
try {
Thread.sleep(50);//模拟耗时操作
System.out.println(name + ":" + i);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}上面的样例中TestRunnable实现了Runnable接口,并重载了当中的run()方法,在run()方法中模拟了耗时操作。
在main()方法中,首先创建了两个TestRunnable的实例,接着调用Thread的构造方法来创建了两个线程类,最后调用线程的start()方法来执行线程。这两个线程并行执行,能够看到输出结果为
每次的输出结果都不同,由于线程的执行是不确定的。随机器和执行的状态而变化。
四、线程中须要注意的一些小问题:
1、每一个线程都有自己的名字。假设不明白指定名字。那么线程的名字由虚拟机自己分配。
主线程的名字总是main。非主线程的名字不确定,视虚拟机分配的名字而定。
全部的线程(包含主线程main)的名字都能够设置和获取它的名字。
2、获取当前线程的对象的方法:Thread.currentThread();
3、线程的运行并非按某种顺序而运行的。对于不论什么一组启动的线程来说,调度程序不能保证其运行顺序,持续时间也无法确定,上面的线程样例中。每次运行的结果都不同,正好能够说明这一点。
4、线程的run()方法执行完成,则此线程结束。一个可执行的线程或者死线程能够被又一次启动。
5、线程的调度是JVM上的一部分。在一个CPU的机器上,实际上一次仅仅能执行一个线程。一次仅仅有一个线程栈执行。JVM线程调度程序决定实际执行那个处于可执行状态的线程。
可执行状态线程被选择的顺序是不确定的。
版权声明:本文博客原创文章,博客,未经同意,不得转载。
-
7、Java并发性和多线程-如何创建并运行线程
2021-03-08 18:01:49可以用如下方式用java中创建一个线程:Tread thread = new Thread();执行该线程可以调用该线程的start()方法:thread.start();在上面的例子中,我们并没有为线程编写运行代码,因此调用该方法后线程就终止了。编写...Java线程类也是一个object类,它的实例都继承自java.lang.Thread或其子类。 可以用如下方式用java中创建一个线程:
Tread thread = new Thread();
执行该线程可以调用该线程的start()方法:
thread.start();
在上面的例子中,我们并没有为线程编写运行代码,因此调用该方法后线程就终止了。
编写线程运行时执行的代码有两种方式:一种是创建Thread子类的一个实例并重写run方法,第二种是创建类的时候实现Runnable接口。接下来我们会具体讲解这两种方法:
创建Thread的子类
创建Thread子类的一个实例并重写run方法,run方法会在调用start()方法之后被执行。例子如下:
public class MyThread extendsThread {public voidrun(){
System.out.println("MyThread running");
}
}
可以用如下方式创建并运行上述Thread子类
MyThread myThread = newMyThread();
myTread.start();
一旦线程启动后start方法就会立即返回,而不会等待到run方法执行完毕才返回。就好像run方法是在另外一个cpu上执行一样。当run方法执行后,将会打印出字符串MyThread running。
你也可以如下创建一个Thread的匿名子类:
Thread thread = newThread(){public voidrun(){
System.out.println("Thread Running");
}
};
thread.start();
当新的线程的run方法执行以后,计算机将会打印出字符串”Thread Running”。
实现Runnable接口
第二种编写线程执行代码的方式是新建一个实现了java.lang.Runnable接口的类的实例,实例中的方法可以被线程调用。下面给出例子:
public class MyRunnable implementsRunnable {public voidrun(){
System.out.println("MyRunnable running");
}
}
为了使线程能够执行run()方法,需要在Thread类的构造函数中传入MyRunnable的实例对象。示例如下:
Thread thread = new Thread(newMyRunnable());
thread.start();
当线程运行时,它将会调用实现了Runnable接口的run方法。上例中将会打印出”MyRunnable running”。
同样,也可以创建一个实现了Runnable接口的匿名类,如下所示:
Runnable myRunnable = newRunnable(){public voidrun(){
System.out.println("Runnable running");
}
}
Thread thread= newThread(myRunnable);
thread.start();
创建子类还是实现Runnable接口?
对于这两种方式哪种好并没有一个确定的答案,它们都能满足要求。就我个人意见,我更倾向于实现Runnable接口这种方法。因为线程池可以有效的管理实现了Runnable接口的线程,如果线程池满了,新的线程就会排队等候执行,直到线程池空闲出来为止。而如果线程是通过实现Thread子类实现的,这将会复杂一些。
有时我们要同时融合实现Runnable接口和Thread子类两种方式。例如,实现了Thread子类的实例可以执行多个实现了Runnable接口的线程。一个典型的应用就是线程池。
常见错误:调用run()方法而非start()方法
创建并运行一个线程所犯的常见错误是调用线程的run()方法而非start()方法,如下所示:
Thread newThread = newThread(MyRunnable());
newThread.run();//should be start();
起初你并不会感觉到有什么不妥,因为run()方法的确如你所愿的被调用了。但是,事实上,run()方法并非是由刚创建的新线程所执行的,而是被创建新线程的当前线程所执行了。也就是被执行上面两行代码的线程所执行的。想要让创建的新线程执行run()方法,必须调用新线程的start方法。
线程名
当创建一个线程的时候,可以给线程起一个名字。它有助于我们区分不同的线程。例如:如果有多个线程写入System.out,我们就能够通过线程名容易的找出是哪个线程正在输出。例子如下:
MyRunnable runnable = newMyRunnable();
Thread thread= new Thread(runnable, "New Thread");
thread.start();
System.out.println(thread.getName());
需要注意的是,因为MyRunnable并非Thread的子类,所以MyRunnable类并没有getName()方法。可以通过以下方式得到当前线程的引用:
Thread.currentThread();
因此,通过如下代码可以得到当前线程的名字:
String threadName = Thread.currentThread().getName();
线程代码举例:
这里是一个小小的例子。首先输出执行main()方法线程名字。这个线程JVM分配的。然后开启10个线程,命名为1~10。每个线程输出自己的名字后就退出。
public classThreadExample {public static voidmain(String[] args){
System.out.println(Thread.currentThread().getName());for(int i=0; i<10; i++){new Thread("" +i){public voidrun(){
System.out.println("Thread: " + getName() + "running");
}
}.start();
}
}
}
这将产生如下所示结果:
需要注意的是,尽管启动线程的顺序是有序的,但是执行的顺序并非是有序的。也就是说,1号线程并不一定是第一个将自己名字输出到控制台的线程。这是因为线程是并行执行而非顺序的。JVM和操作系统一起决定了线程的执行顺序,他和线程的启动顺序并非一定是一致的。
-
Java创建线程的两个方法
2020-12-22 21:54:24要产生一个线程,有两种方法: ◆需要从Java.lang.Thread类派生一个新的线程类,重载它的run()方法; ◆实现Runnalbe接口,重载Runnalbe接口中的run()方法。 为什么Java要提供两种方法来创建线程呢?它们都... -
Java 创建线程的两个方法详解及实例
2020-08-31 02:38:20主要介绍了Java 创建线程的两个方法详解及实例的相关资料,需要的朋友可以参考下 -
Java创建线程
2022-04-05 22:49:44一个线程指的是进程中一个单一顺序的控制流。 其实:进程在我们计算机中我们随时都在使用:按住 Ctrl + shift + esc 这个就是一个进程,在计算机中,线程就是进程中的一个执行单元。 那么,进程是什么呢? ...目录
创建线程的第二种方式:使用 Thread(Runnable target) 构造方法,创建对象
既然说到线程,在这里就给大家普及一下线程。
🎇🎇🎇🎇🎇🎇🎇🎇
线程(Thread):
- 是操作系统能够进行运算调度的最小单位。
- 它被包含在进程之中,是进程中的实际运作单位。
- 一个线程指的是进程中一个单一顺序的控制流。
🥂🥂🥂
其实:进程在我们计算机中我们随时都在使用:按住 Ctrl + shift + esc
这个就是一个进程,在计算机中,线程就是进程中的一个执行单元。
那么,进程是什么呢?
进程:简简单单,我们日常中使用的QQ就是一个进程,进程可以理解为就是一个软件,线程则就是这个软件中的一些功能,多个线程同时工作,才能使得进程工作。🤔🤔🤔。
使用官方的话来描述进程:
是计算机中的程序关于某数据集合上的一次运行活动,是操作系统进行资源分配与调度的基本单位。
接下来,就让我们步入主题:
⏰⏰⏰⏰⏰⏰⏰⏰⏰⏰⏰⏰⏰⏰⏰⏰⏰⏰⏰⏰
在 Java 中,是这样说线程的:
Java中,Thread类定义为:继承 了祖先类 Object ,实现了 Runable 接口。
public class Thread extends Object implements Runnable
线程是程序(进程)中执行的线程。
Java虚拟机允许应用程序同时执行多个执行线程。
每个线程都有优先权。 具有较高优先级的线程优先于优先级较低的线程执行。 每个线程可能也可能不会被标记为守护程序。 当在某个线程中运行的代码创建一个新的Thread对象时,新线程的优先级最初设置为等于创建线程的优先级,并且当且仅当创建线程是守护进程时才是守护线程。当Java虚拟机启动时,通常有一个非守护进程线程(通常调用某些指定类的名为main的方法)。 Java虚拟机将继续执行线程,直到发生以下任一情况:
已经调用了Runtime类的exit方法,并且安全管理器已经允许进行退出操作。
所有不是守护进程线程的线程都已经死亡,无论是从调用返回到run方法还是抛出超出run方法的run 。
创建一个新的执行线程有两种方法。第一种:创建一个类实现 Thread 类
package stu.my.cdn.creadthread.p1; /** * 创建线程的第一种方式:创建类,实现 Thread 方法 */ public class MyThread extends Thread { /** * run () 方法就是子线程要执行的代码 */ @Override public void run() { System.out.println("这是子线程打印的东西"); } /** * 主线程 main */ public static void main(String [] args) { System.out.println("JVM 启动 main线程,main线程执行了main方法"); // 创建子线程对象 MyThread thread = new MyThread(); // 启动线程----启动线程后,会自动执行自定义类中的 run 方法 thread.start(); System.out.println("mian 主线程执行结束"); } }
以下是程序的输出结果:
这种程序执行分为三种方式:
串行:特殊的并行,程序排队执行,比较耗时,但安全。
并发:一个程序执行,在等待阶段,下一个开始。
并行:简单粗暴,程序一起开始执行,一般效率高。
从硬件角度来说:如果是单核 CPU ,一个处理器一次只能执行一个线程的情况下,处理器可以使用时间片轮转技术,可以让 CPU 快速的在各个线程之间进行切换,对用户来说,感觉是三个线程在同时执行,如果是多核 CPU ,可以为不同的线程分配不同的 CPU 内核。
package stu.my.cdn.creadthread.p2; public class MyThread2 extends Thread{ @Override public void run() { // 处理异常快捷键 ,选中代码: Ctrl + Alt + T try { for(int i = 1; i <= 5; i++){ System.out.println("子线程==>" + i); int time = (int) (Math.random() * 1000); Thread.sleep(time); // 线程睡觉,单位是 毫秒, 1s = 1000ms } } catch (InterruptedException e) { e.printStackTrace(); } } public static void main(String[] args) { MyThread2 myThread2 = new MyThread2(); myThread2.start(); // 开启子线程 try { for(int i = 1; i <= 5; i++){ System.out.println("主线程main==>" + i); int time = (int) (Math.random() * 1000); Thread.sleep(time); // 线程睡觉,单位是 毫秒, 1s = 1000ms } } catch (InterruptedException e) { e.printStackTrace(); } } }
第一次执行顺序:
第二次执行顺序 :
创建线程的第二种方式:使用 Thread(Runnable target) 构造方法,创建对象
如果已经类已经有了继承的父类,则第一种方式便不再使用这种情况,(因为在JAVA中一个类只能有一个父类):🤔🤔🤔🤔
那我们便可以使用这种方式:实现接口,使用构造方法,创建线程:
package stu.my.cdn.creadthread.p3; /** * 当线程已经有父类了,就不能继承 Thread 类的形式创建线程了,可以使用 Runnable 接口的形式 */ public class MyRunnable implements Runnable{ /** * 这里的 run 方法 就相当于我们日常中使用的 main 方法 * 一旦 线程 start() 就会执行这个方法 */ @Override public void run() { for(int i = 0; i <= 5; i++){ System.out.println("MyRunnable implements Runnable 's run method:" + i); } } public static void main(String[] args) { // 创建 Runnable 接口的实现类 MyRunnable myRunnable = new MyRunnable(); // 使用 Runnable 的 Thread(Runnable target) 方法,创建线程对象 Thread thread = new Thread(myRunnable); // 开启线程 thread.start(); // main 线程 for (int i = 1; i <= 5; i++){ System.out.println("Runnable is main:" +i);; } // 使用匿名内部内实现 Thread thread1 = new Thread(new Runnable() { @Override public void run() { for(int i = 0; i < 5; i++){ System.out.println("use anonymous interior class finished thread create :" + i); } } }); // 开启 thread1 thread1.start(); } }
一样,线程每次并行执行,根据 CPU 核数的不同和允许执行线程的数量,利用对应的技术,在各个线程之间切换,提高执行的效率。
本期就到这里~~~
感谢大家阅读~~~
-
Java创建多线程的五种方法
2021-12-31 15:01:09Java创建多线程的五种方法总结 -
如何在java中创建一个线程
2021-03-04 09:01:44在java中创建一个线程有两种方法:第一种:将类声明为Thread的子类。并子类应重写Thread类的run方法并创建start方法启动线程。第二种:实现Runnable接口,并覆盖接口中的run方法,将线程的任务代码封装到run方法中;... -
Java四种方法实现两个线程打印1~100(Thread、Runnable、Callable、线程池)
2022-02-09 22:27:10一、继承Thread类 public class TestThread1 extends Thread { ... System.out.println("线程1的" + i); try { sleep(100); } catch (InterruptedException e) { e.printStackTrace(); } } -
Java两个线程交替打印奇偶数(两种方法对比)
2020-10-31 15:11:20我们将通过“两个线程交替打印100内的奇偶数”,来展示下`wait()`方法和`notify()`方法的用法和优点,当然要体现出优点,自然要通过对比不使用这两个方法实现同一功能的代码,通过这几篇文章的讲解,帮你彻底搞懂`... -
java创建两个线程的方法和它们的区别
2012-07-31 15:01:27Java提供了线程类Thread来创建多线程的程序...要产生一个线程,有两种方法: ◆需要从Java.lang.Thread类派生一个新的线程类,重载它的run()方法; ◆实现Runnalbe接口,重载Runnalbe接口中的run()方法。 为 -
java多个线程同时开始执行
2021-02-26 13:30:15有时候有这样的需求,需要多个线程执行任务,每个线程都执行不同的准备工作,全部准备好了,才能同时执行下面的工作。这个怎么实现呢?一是用CyclicBarrier (适用在多线程相互等待,直到到达一个屏障点。并且... -
java多线程实验报告
2020-11-07 10:06:391. 应用图形用户接口和多线程的知识,编写一个应用程序实现下述功能:当单击...创建分别代表两匹马的两个线程,并将它们设置为高低不同的优先级,以进度条的形式显示赛马过程。(提示:使用JProgressBar类创建进度条) -
#Java编程# 编写一个应用程序创建两个线程,一个线程打印输出1~100之间所有的奇数,另外一
2021-03-08 03:26:00满意答案fgdmqqq42016.06.04采纳率:54%等级:9已帮助:964人import java.util.Random;class A extends Thread{int i=1;Random r=new Random();public void run(){4102while(i<100){System.out.println("奇数1653... -
创建两个线程,要求分别输出26个字母
2020-05-14 11:33:10编写一个程序,创建两个线程,要求分别输出26个字母。在输出结果时,要显示是哪个线程输出的字母。注:26个字母可以首先定义一个字符a,在a的基础上循环加1实现。(麻烦给出代码,最好能够讲解一下) -
Java 创建两个线程,和主线程交替运行。
2016-05-08 20:29:21Java 创建两个线程,和主线程交替运行。 -
Java创建子线程的两种方法
2021-03-14 18:39:06摘要:其实两种方法归结起来看还是一种,都是利用Thread的构造器进行创建,区别就是一种是无参的,一种是有参的。一、继承Thread线程类:通过继承Thread类,重写run方法,子类对象就可以调用start方法启动线程,JVM... -
java多线程编程 在主线程main中创建两个子线程
2009-01-03 15:21:03自己学着编写的一个JAVA多线程程序,该程序实现的功能是:在主线程main中创建两个子线程,A和B,线程A先运行,再运行B线程,当两个子线程都运行完毕后,才运行主线程,并最终结束整个程序的运行。 希望该程序对初学... -
java中创建线程两个方法及区别
2013-10-17 19:14:13详细的介绍了java中创建两种线程的方法和区别 -
Java创建线程的两种方法
2021-02-27 15:34:23大多数情况,通过实例化一个Thread对象来创建一个线程。Java定义了两种方式:实现Runnable 接口;可以继承Thread类。下面的两小节依次介绍了每一种方式。实现Runnable接口创建线程的最简单的方法就是创建一个实现... -
java多线程编程之使用runnable接口创建线程
2020-09-04 16:43:27实现Runnable接口的类必须使用Thread类的实例才能创建线程,通过Runnable接口创建线程分为以下两步 -
java中一个线程等待另一个线程执行完后再执行
2021-02-28 11:55:40该问题大概有3种方法:1.notify、wait方法,Java中的唤醒与等待方法,关键为synchronized代码块,参数线程间应相同,也常用Object作为参数,示例如下。package com.thread_lc;class MyThread1 implements Runnable{... -
在Java中创建线程有两种方法
2011-08-05 10:36:27在Java中创建线程有两种方法:使用Thread类和使用Runnable接口。在使用Runnable接口时需要建立一个Thread实例。因此,无论是通过Thread类还是Runnable接口建立线程,都必须建立Thread类或它的子类的实例。 -
Java 多线程实现的三种方法,附两个线程执行不同的输出
2016-03-30 23:08:34JAVA多线程实现方式主要有三种:继承Thread类、实现Runnable接口、使用ExecutorService、Callable、Future实现有返回结果的多线程。其中前两种方式线程执行完后都没有返回值,只有最后一种是带返回值的。1、继承... -
java用线程的两种实现方式设计四个线程两次对J加1两次对J减1
2012-11-19 15:35:46java用线程的两种实现方式设计四个线程两次对J加1两次对J减1 -
关于Java堆内存是线程共享的吗?
2021-01-20 03:14:17首先,在JVM的内存结构中,比较常见的两个区域是堆内存和栈内存关于这两个概念的介绍一般如下: 1、堆是线程共享的内存区域,栈是线程独享的内存区域。 2、堆中主要存放对象实例,栈中主要存放各种基本数据类型、... -
java创建线程的四种方式
2022-03-14 11:52:41查看Thread类源码可以发现,有下面这么一个构造参数,target是线程启动的时候要调用的方法(Runnable接口中有个run方法),如果为空,那这个类的运行方法什么都不做 那我们是否可以直接初始化线程,然后调用start方法... -
java多线程练习:如何在一个主线程中创建两个子线程
2020-07-12 17:05:26创建两个分线程,让其中一个线程输出1-100之间的偶数,另一 个线程输出1-100之间的奇数。 解答 方法1 // 定义子类继承Thread类 class MyThread1 extends Thread{ //子类中重写Thread类中的run方法。 @Override ... -
如何创建并运行java线程
2021-01-20 03:38:20可以用如下方式用java中创建一个线程: Tread thread = new Thread(); 执行该线程可以调用该线程的start()方法: thread.start(); 在上面的例子中,我们并没有为线程编写运行代码,因此调用该方法后线程...