做众筹网站怎么赚钱郑州市哪里有网站建设
2026/5/21 18:11:45 网站建设 项目流程
做众筹网站怎么赚钱,郑州市哪里有网站建设,软文推广模板,百度招聘 网站开发一.多线程共有3种实现方式#xff1a; 二.第一种实现方式#xff1a;继承Thread类的方式进行实现 1.Thread类详解#xff1a; 如上图#xff0c;其中解释到线程 是程序中的执行线程。Java 虚拟机允许应用程序并发地运行多个执行线程#xff0c;意思是Thread类就表示Java里…一.多线程共有3种实现方式二.第一种实现方式继承Thread类的方式进行实现1.Thread类详解如上图其中解释到线程是程序中的执行线程。Java 虚拟机允许应用程序并发地运行多个执行线程意思是Thread类就表示Java里的一个线程如果想要拥有一条线程的话就可以创建Thread类对象并开启它即可。具体实现步骤如下多线程的第一种启动方式* 步骤一自己定义一个类继承Thread类* Thread类Java已经定义好表示线程因此自己定义的类也表示线程因为是Thread类的子类* 步骤二重写run方法* 步骤三创建子类的对象并启动线程2.实例如上图该创建新执行线程的方法是将类声明为Thread的子类。该子类应重写Thread类的run方法。接下来可以分配并启动该子类的实例即接下来可以创建子类的对象。例如计算大于某一规定值的质数的线程可以写成如上图的代码 调用start方法来开启线程后就会自动去找对应的run方法去执行run方法里的代码再举一个例子package com.itheima.a01threadcase1; public class MyThread extends Thread{ //重写run方法并书写线程要执行的代码 Override public void run() { /*开始书写线程要执行的代码*/ for (int i 0; i 5; i) { System.out.println(Hello World); } } }package com.itheima.a01threadcase1; public class ThreadDemo { public static void main(String[] args) { /* * 多线程的第一种启动方式 * 步骤一自己定义一个类继承Thread类 * Thread类Java已经定义好表示线程因此自己定义的类也表示线程因为是Thread类的子类 * 步骤二重写run方法 * 步骤三创建子类的对象并启动线程 * * */ //1.创建Thread类的子类MyThread的对象 MyThread t1new MyThread(); //2.启动线程 /*注启动线程不能直接调用run方法 如果直接调用run方法仅仅是调用了一个方法与之前的单线程程序是一样的 正确的操作是调用start方法启动线程start方法才表示开启线程 之后也就无需调用run方法了因为调用start方法后Java会自动去找对应的run方法去执行run方法里的代码*/ t1.start(); } }这里可能会有疑问上述代码与之前的创建对象并调用方法有什么区别呢此时还没有什么区别因为现在只创建了一个线程对象如果现在再创建第二个线程对象并启动第二个线程对象如下图此时运行上图的程序就会出现一会儿执行第一条线程t1一会儿执行第二条线程t2由于t1和t2执行的代码都是run方法里的内容而且都是打印Hello World所以此时直接运行的话是无法分清谁是哪个线程打印的所以在这儿还需要额外的做一些处理给t1和t2这两个线程分别起一个名字并在run方法里把对应的名字写上代码如下package com.itheima.a01threadcase1; public class MyThread extends Thread{ //重写run方法并书写线程要执行的代码 Override public void run() { /*开始书写线程要执行的代码*/ for (int i 0; i 99; i) { /*这里多循环几次为了更好的看出进程交替进行 循环次数少可能看不出因为循环次数少可能在进程数的最大范围内可以不交替就同时进行*/ //getName方法用于获取线程的名字为了区分线程进行过程子类MyThread可直接调用父类Thread的方法 //哪个线程调用run方法getName方法获取的就是哪个线程的名字 System.out.println( getName()-Hello World); } } }package com.itheima.a01threadcase1; public class ThreadDemo { public static void main(String[] args) { /* * 多线程的第一种启动方式 * 步骤一自己定义一个类继承Thread类 * Thread类Java已经定义好表示线程因此自己定义的类也表示线程因为是Thread类的子类 * 步骤二重写run方法 * 步骤三创建子类的对象并启动线程 * * */ //1.创建Thread类的子类MyThread的对象 MyThread t1new MyThread(); MyThread t2new MyThread(); /*给t1和t2分别起一个名字为了区分两个线程*/ t1.setName(线程1); t2.setName(线程2); //2.启动线程 t1.start(); t2.start(); } }运行结果如下只截取了一部分三.第二种实现方式实现Runnable接口的方式进行实现1.实现Runnable接口详解如上图创建线程的另一种方法是声明实现Runnable接口的类。该类然后实现run方法也就是说要自己定义一个类去实现Runnable这个接口再去重写里面的run方法即可(实现接口就要重写该接口的所有抽象方法Runnable接口里只有抽象方法run所以重写run方法)在测试类中首先要创建自己的类然后再创建Thread线程对象把自己创建的对象传递给线程对象Thread后再调用start方法启动线程。具体实现步骤如下多线程的第二种启动方式* 步骤一自己定义一个类实现Runnable接口* 步骤二重写里面的run方法* 步骤三创建自己的类对象* 步骤四创建一个Thread类对象并开启线程2.例一只创建一个线程对象代码package com.itheima.a02threadcase2; public class ThreadDemo { public static void main(String[] args) { /* * 多线程的第二种启动方式 * 步骤一自己定义一个类实现Runnable接口 * 步骤二重写里面的run方法 * 步骤三创建自己的类对象 * 步骤四创建一个Thread类对象并开启线程 * */ //1.创建自己的类MyRun对象 /*MyRun类此时表示多线程要执行的任务*/ MyRun mrnew MyRun(); //2.创建线程对象 /*当前线程对象要执行mr里的代码所以把mr传递给线程即可*/ Thread t1new Thread(mr); //3.开启线程 t1.start(); } }package com.itheima.a02threadcase2; public class MyRun implements Runnable{ Override public void run() { /*run是一个抽象方法实现接口就要重写该接口的所有抽象方法*/ //书写线程要执行的代码 for (int i 0; i 100; i) { System.out.println(Hello World); } } }运行结果3.例二创建多个线程对象代码package com.itheima.a02threadcase2; public class ThreadDemo { public static void main(String[] args) { /* * 多线程的第二种启动方式 * 步骤一自己定义一个类实现Runnable接口 * 步骤二重写里面的run方法 * 步骤三创建自己的类对象 * 步骤四创建一个Thread类对象并开启线程 * */ //1.创建自己的类MyRun对象 /*MyRun类此时表示多线程要执行的任务*/ MyRun mrnew MyRun(); //2.创建线程对象 /*当前线程对象要执行mr里的代码所以把mr传递给线程即可*/ Thread t1new Thread(mr); Thread t2new Thread(mr); /*给线程对象设置名字为了区分哪个线程正在进行*/ t1.setName(线程1); t2.setName(线程2); //3.开启线程 t1.start(); t2.start(); } }package com.itheima.a02threadcase2; public class MyRun implements Runnable{ Override public void run() { /*run是一个抽象方法(实现接口就要重写该接口的所有抽象方法)*/ //书写线程要执行的代码 for (int i 0; i 100; i) { /*这里不能直接调用getName方法获取线程名字因为getName方法位于Thread类此时MyRun * 只是实现了接口RunnableRunnable接口没有getName方法此时该怎么获取线程名字呢 * 技巧打印之前先获取到当前线程的对象可以使用静态方法currentThread*/ //currentThread方法的作用是返回当前正在执行的线程对象 Thread t Thread.currentThread(); System.out.println(t.getName():Hello World); //比如t1开始线程调用start方法自动执行run方法首先获取到t1的名字线程1再输出打印 //本例中有两个线程每个线程循环遍历100个共200个只不过线程交替打印 } } }运行结果四.Thread类常用方法五.第三种实现方式利用Callable接口和Future接口方式实现1.具体实现步骤如下多线程的第三种实现方式* 为什么要有多线程的第三种实现方式呢其实是对多线程的第一、二种实现方式的补充-* 第一种实现方式是继承Thread类并重写run方法但run方法没有返回值此时就无法获取多线程运行的结果* 同理第二种实现方式是实现了Runnable接口并重写了抽象方法run该run方法也没有返回值* 因此如果此时要获取多线程运行的结果第一、二种实现方式就无法做到那么该怎么办呢* 因此就要用到多线程的第三种实现方式* 特点多线程的第三种实现方式可以获取到多线程的运行结果* 步骤如下* 步骤一创建一个类如MyCallable实现Callable接口* 步骤二重写Callable接口里的所有抽象方法Callable接口里的抽象方法只有call因此重写call方法注call方法是有返回值的这个返回值就表示多线程运行的结果* 步骤三创建刚才创建的类MyCallable的对象(表示多线程要执行的任务)* 步骤四创建FutureTask的对象(作用管理多线程运行的结果-所以要想获取到多线程运行的结果直接到创建FutureTask的对象里拿即可)* 关键在于Future是一个接口不能直接创建Future的对象要创建Future的实现类的对象FutureTask是Future的实现类对象* 步骤五创建Thread类的对象(表示线程)并启动线程。2.实例package com.itheima.a03threadcase3; import java.util.concurrent.ExecutionException; import java.util.concurrent.FutureTask; public class ThreadDemo { public static void main(String[] args) throws ExecutionException, InterruptedException { /* * 多线程的第三种实现方式 * 为什么要有多线程的第三种实现方式呢其实是对多线程的第一、二种实现方式的补充- * 第一种实现方式是继承Thread类并重写run方法但run方法没有返回值此时就无法获取多线程运行的结果 * 同理第二种实现方式是实现了Runnable接口并重写了抽象方法run该run方法也没有返回值 * 因此如果此时要获取多线程运行的结果第一、二种实现方式就无法做到那么该怎么办呢 * 因此就要用到多线程的第三种实现方式 * 特点多线程的第三种实现方式可以获取到多线程的运行结果 * 步骤如下 * 步骤一创建一个类如MyCallable实现Callable接口 * 步骤二重写Callable接口里的所有抽象方法Callable接口里的抽象方法只有call因此重写call方法注call方法是有返回值的这个返回值就表示多线程运行的结果 * 步骤三创建刚才创建的类MyCallable的对象(表示多线程要执行的任务) * 步骤四创建FutureTask的对象(作用管理多线程运行的结果-所以要想获取到多线程运行的结果直接到创建FutureTask的对象里拿即可) * 关键在于Future是一个接口不能直接创建Future的对象要创建Future的实现类的对象FutureTask是Future的实现类对象 * 步骤五创建Thread类的对象(表示线程)并启动线程 * */ //1.创建刚才创建的类MyCallable的对象(表示多线程要执行的任务) MyCallable mcnew MyCallable(); //2.创建Future接口的实现类对象FutureTask用于管理多线程运行的结果 /*FutureTask对象的泛型表示多线程运行的结果本例中多线程运行的结果为Integer型*/ FutureTaskInteger ftnew FutureTask(mc); /*mc传入表示现在要用FutureTask对象去管理mc的结果*/ //3.创建线程对象 Thread t1new Thread(ft); /*该线程要执行ft所以传入ft*/ //4.启动线程 t1.start(); //5.获取到多线程运行的结果 /*该如何获取呢刚才说了FutureTask就是用来管理线程运行结果的 * 所以可以直接用FutureTask类里的get方法来获取线程的结果 * get方法返回值的类型就是线程运行结果的类型此时是Integer型*/ Integer result ft.get(); //6.输出 System.out.println(result); } }package com.itheima.a03threadcase3; import java.util.concurrent.Callable; public class MyCallable implements CallableInteger { /*Callable接口是有一个泛型的即CallableV这个泛型V是什么意思呢 * 注第三种实现方式可以获取到多线程运行的结果那么这里的泛型V表示线程的结果的类型 * 比如想要开启一个线程让它求1到100的整数和最终的结果是整数所以此时泛型V就可以写Integer*/ //重写抽象方法callcall方法的返回值与泛型V保持一致因为call方法表示多线程运行的结果泛型V也表示多线程运行的结果 Override public Integer call() throws Exception { //求1到100之间的和 int sum0; for (int i 1; i 100; i) { sumsumi; } return sum; } }六.总结对于多线程的实现方式可以分为两类本篇中第一、二种实现方式分为一类无法获取到多线程的结果第三种实现方式分为一类此时可以获取到多线程的结果-所以如果要用到多线程的结果就可以使用第三种实现方式如果无需多线程的结果可以选择第一或第二种实现方式多线程的第一种实现方式与第二种实现方式的区别第一种实现方式代码比较简单而且是继承Thread类所以在子类中可以直接使用Thread类里的方法但可扩展性比较差因为Java中是单一继承此时继承了Thread类就无法再继承其他的类了第二种实现方式解决了第一种实现方式的缺点第二种实现方式扩展性强因为一个类可以实现多个接口实现了Runnable接口后还可以实现其他接口并且还可以继承其他的类扩展性比较强但代码相对比较复杂因为此时只是实现了Runnable接口并没有线程对象Thread类也就不能直接使用Thread类中的方法如果想用Thread类的方法还需先获取到Thread类的对象再调用Thread类的方法

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询