问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

JAVA线程能创建线程吗

发布网友 发布时间:2022-04-23 09:23

我来回答

2个回答

热心网友 时间:2023-10-09 10:30

Java有三种创建线程的方式,分别是继承Thread类、实现Runable接口和使用线程池
1、继承Thread类
使用该方式创建及使用线程需按以下三个步骤:
(1)定义Thread类的子类,并重写父类的run()方法,方法里的内容就是线程所要执行的任务;
(2)创建子类的实例,即生成线程的实例对象;
(3)调用现成的start()方法来启动线程。
public class SubThread extends Thread {
private int ticket = 100; private String name; public ImplThread(String name) { this.name = name;
} public void run() { while (k > 0){
System.out.println(ticket-- + "is saled by" + name);
} try{
sleep((int)Math.random() * 10);
}catch (InterruptedException e){
e.printStackTrace();
}
} public static void main (String []args){
SubThread t1 = new SubThread("A");
SubThread t2 = new SubThread("B");
t1.start();
t2.start();
}
}1234567891011121314151617181920212223

2、实现Runnable接口
(1)定义实现Runnable接口的实现类,并重写run()方法;
(2)创建Runnable接口实现类的实例,并将该实例作为参数传到Thread类的构造方法中来创建Thread对象,该Thread对象才是真正的线程对象;
(3)调用现成的start()方法来启动线程。
public class ImplThread implements Runnable {
private int ticket = 100; private String name; public ImplThread(String name) { this.name = name;
} public void run() { while (k > 0){
System.out.println(ticket-- + "is saled by" + name);
} try{
sleep((int)Math.random() * 10);
}catch (InterruptedException e){
e.printStackTrace();
}
} public static void main (String []args){
ImplThread i1 = new ImplThread("A");
ImplThread i2 = new ImplThread("B");
Thread t1 = new Thread(i1);
Thread t2 = new Thread(i2);
t1.start();
t2.start();
}
}12345678910111213141516171819202122232425

上面这段代码跟继承Thread类的线程代码呈现的效果是一样的,虽然执行的是相同的代码,但彼此相互独立,且各自拥有自己的资源,互不干扰。
但是,在某些场景,我们希望各线程能共享资源,这时候就只能扩展Runnable接口了。
public class ImplThread implements Runnable {
private int ticket = 100; public void run() { while (k > 0){
System.out.println(ticket-- + "is saled by" + Thread.currentThread());
} try{
sleep((int)Math.random() * 10);
}catch (InterruptedException e){
e.printStackTrace();
}
} public static void main (String []args){
ImplThread i = new ImplThread();
Thread t1 = new Thread(i);
Thread t2 = new Thread(i);
t1.start();
t2.start();
}
}1234567891011121314151617181920

这时候,线程t1和t2共享这100张票。
3、使用线程池
使用线程池并不是创建线程,而是对线程进行管理。Excetor为线程池超级接口,该接口中定义了一个execute(Runnable command)方法,用来执行传递过来的线程,ExecutorService就是我们所说的线程池,它继承了Excetor接口。如何创建线程池呢?Java提供了Executors类,该类有四个静态方法分别可以创建不同类型的线程池(ExecutorService)。
Executors.newCachedThreadPool() 创建可变大小的线程池
Executors.newFixedThreadPool(int number) 创建固定大小的线程池
Executors.newSingleThreadPool() 创建单任务线程池
Executors.newScheledThreadPool(int number) 创建延迟线程池
import java.util.concurrent.Executors;
import java.util.concurrent.ExecutorService;
public class Test {   public static void main(String[] args) {
//创建一个可重用固定线程数的线程池   ExecutorService pool = Executors.newFixedThreadPool(2);
//创建实现了Runnable接口对象,Thread对象当然也实现了Runnable接口   Thread t1 = new MyThread();
Thread t2 = new MyThread();
Thread t3 = new MyThread();
Thread t4 = new MyThread();
Thread t5 = new MyThread();
//将线程放入池中进行执行   pool.execute(t1);
pool.execute(t2);
pool.execute(t3);
pool.execute(t4);
pool.execute(t5);
//关闭线程池   pool.shutdown();
}
}
class MyThread extends Thread{   @Override
public void run() {
System.out.println(Thread.currentThread().getName()+"正在执行。。。");
}
} 12345678910111213141516171819202122232425262728

输出:
pool-1-thread-1正在执行。。。
pool-1-thread-1正在执行。。。
pool-1-thread-1正在执行。。。
pool-1-thread-1正在执行。。。
pool-1-thread-2正在执行。。。
Process finished with exit code 0
可见,线程得到了重用,线程池里只有两个线程在执行。

热心网友 时间:2023-10-09 10:30

当然可以,没有*创建线程的必须是主线程。
Java使用Thread类代表线程,所有的线程对象都必须是Thread类或其子类的实例。Java可以用三种方式来创建线程,如下所示:
1)继承Thread类创建线程
2)实现Runnable接口创建线程
3)使用Callable和Future创建线程
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
女人脚出汗有酸味是怎么回事 脚的酸味是什么原因 请问南充有奥迪4S店或者奥迪专修店吗?电话号码是多少? ...不爱我了,对我已经死心了!我该怎么做,真的很爱她,好想挽回,我也不... 烂板凳的意思是什么 爸爸过世几个月了,为什么还梦见爸爸还没埋葬呢,看见爸爸的尸体_百度知 ... 眼睛结膜炎痒怎么办 结膜炎眼睛痒怎么缓解 结膜炎眼角痒怎么办 苹果电脑下载什么编辑器适合mac的视频剪辑软件有哪些 交强险出险商业险会涨吗 java创建线程 java 创建线程 调用方法有哪些 java中创建线程的两种方式有什么区别 车四年了,就今年出了一次无法找到第三方的险,1500元,下一年保险涨多少钱? 马布里有大动作,为北控打造新阵容冲冠,最有可能招募谁? 在java中,怎样创建一个线程 马布里NBA生涯总薪金1.5亿,作为最成功外援,他在CBA共赚多少? 马布里作为外援在CBA赚了多少钱? java多线程与并发之创建线程的几种方式 斯蒂芬·马布里为什么要离开森林狼队加入新泽西篮网队? 交强险出险 会涨价 Java并发编程:如何创建线程,进程 马布里是在中国真正取得成功的国际球员,拥有怎样的成绩? 交强险出险一次会不会涨 马布里被称为顶级后卫,巅峰时期的他有多强? Java开发如何创建一个线程? 请问马布里为什么叫“马政委” java中怎么创建线程 马布里为什么来中国? java有几种实现线程的方式? 交强险出险要涨保费 java多线程有几种创建方法??? 今年出险两次一次交强险一次车损明年保费会长多少啊? 创建线程有几种不同方式,最常用那种 Java面试题 车出险一次,来年保费涨多少? 镉污染是怎么来的? 土壤镉污染来源于哪里? 镉是什么? 镉污染从哪来? 什么是镉污染? 镉污染的污染来源 什么原因造成镉污染 镉污染是什么? 镉污染会造成什么危害? 重金属污染的主要来源是哪里? 镉污染怎么办呢? 镉污染的危害机理 导致镉污染的原因是? 为什么有时候打开网站会出现下载这个网页的页面? 镉污染会导致什么疾病