java new一个线程需哟注意什么,java怎么创建一个线程
本篇文章给大家谈谈java new一个线程需哟注意什么,以及java怎么创建一个线程对应的知识点,文章可能有点长,但是希望大家可以阅读完,增长自己的知识,最重要的是希望对各位有所帮助,可以解决了您的问题,不要忘了收藏本站喔。
如何在Java中创建一个线程
如何在Java中创建一个线程?
如何在Java中创建一个线程?
Java是一种广泛使用的编程语言,在创建多线程编程时,Java提供了各种不同的方式。在本文中,我们将探讨如何在Java中创建一个线程。
方式一:通过继承Thread类创建线程
Java中的线程类是Thread类,我们可以通过继承Thread类创建一个新的线程。下面是一个使用这种方法创建线程的示例代码:
`
publicclassMyThreadextendsThread{
publicvoidrun(){
System.out.println(线程运行中);
}
publicstaticvoidmain(String[]args){
MyThreadmyThread=newMyThread();
myThread.start();
}
}
`
在这个示例中,我们创建了一个MyThread类,并继承了Thread类,该类实现了run()方法。在main()函数中,我们创建一个新的MyThread对象并调用了start()方法,以启动新的线程。
方式二:通过实现Runnable接口创建线程
另一种创建线程的方法是通过实现Runnable接口。Runnable接口提供了一个run()方法,我们可以通过实现这个方法来实现我们的线程逻辑。下面是一个使用这种方法创建线程的示例代码:
`
publicclassMyRunnableimplementsRunnable{
publicvoidrun(){
System.out.println(线程运行中);
}
publicstaticvoidmain(String[]args){
MyRunnablemyRunnable=newMyRunnable();
Threadthread=newThread(myRunnable);
thread.start();
}
}
`
在这个示例中,我们创建了一个MyRunnable类,并实现了Runnable接口,实现了run()方法。在main()函数中,我们创建一个新的Thread对象并传入MyRunnable实例,调用start()方法以启动新的线程。
方式三:通过使用Lambda表达式创建线程
在Java8中,我们可以使用Lambda表达式创建线程。Lambda表达式提供了一种简化代码的方式。下面是一个使用Lambda表达式创建线程的示例代码:
`
publicclassMyThread{
publicstaticvoidmain(String[]args){
Threadthread=newThread(()->{
System.out.println(线程运行中);
});
thread.start();
}
}
`
在这个示例中,我们创建了一个Thread对象,并使用Lambda表达式实现了run()方法。在main()函数中,我们创建一个新的Thread对象并传入Lambda表达式,调用start()方法以启动新的线程。
Java提供了多种方法创建多线程。我们可以选择使用Thread类,Runnable接口或Lambda表达式来创建线程。无论我们选择哪种方法,最终创建的线程都会执行run()方法中的逻辑。在实际编程中,我们可以根据具体情况选择最适合自己的方法来创建线程。
这个多线程java程序为什么会最开始执行同一个线程两次
Thread t1先执行调用c.manufacture();打印"制造一台电脑" t1等待被t2唤醒wait();
Thread t2执行时调用c.transport();但是没有打印"运走一台电脑"因为"运走一台电脑"没有在c.transport();中wait()前打印,而是在c.transport();调用后打印的,所以这里没有输出.
t2执行唤醒t1 notify();t2等待被t1唤醒wait();注意这时c.transport();并没有执行完,它还在等待被t1唤醒.
Thread t1再执行调用c.manufacture();打印"制造一台电脑"唤醒t2 notify();这时c.transport();执行完了打印"运走一台电脑".然后t1等待被唤醒wait();
Thread t2执行时调用c.transport();但是没有打印"运走一台电脑"唤醒t1 notify();t2 wait();注意这时c.transport();并没有执行完,它还在等待被t1唤醒.
Thread t1执行调用c.manufacture();打印"制造一台电脑"唤醒t2 notify();这时c.transport();执行完了打印"运走一台电脑".然后t1等待被唤醒wait();
上面是造成"制造一台电脑"在开头被打印两次的原因
解决办法就是把打印"运走一台电脑"放到c.transport();函数中wait();语句前,就不会出现打印两次的情况了.
像这样:完整的程序如下:
packageexercise2;
classComputer{
privateintmfg=1;
intstack=0;
publicsynchronizedvoidmanufacture(){
try{
Thread.sleep(50);
}catch(InterruptedExceptione1){
//TODOAuto-generatedcatchblock
e1.printStackTrace();
}
System.out.println("制造一台电脑");
mfg=1;
notify();
if(mfg==1){
try{
wait();
}catch(InterruptedExceptione){
e.printStackTrace();
}
}
}
publicsynchronizedvoidtransport(){
try{
Thread.sleep(50);
}catch(InterruptedExceptione1){
//TODOAuto-generatedcatchblock
e1.printStackTrace();
}
System.out.println("运走一台电脑");//这里加上打印语句
stack+=1;
mfg=0;
notify();
if(mfg==0){
try{
wait();
}catch(InterruptedExceptione){
e.printStackTrace();
}
}
}
}
classproducerimplementsRunnable{
Computerc=null;
publicproducer(Computerc){
this.c=c;
}
@Override
publicvoidrun(){
while(true){
c.manufacture();
}
}
}
classConsumerimplementsRunnable{
Computerc=null;
publicConsumer(Computerc){
this.c=c;
}
@Override
publicvoidrun(){
while(true){
c.transport();
//System.out.println("运走一台电脑");//这里去掉打印语句移动到c.transport();函数中wait语句前
}
}
}
publicclassEx22_2{
publicstaticvoidmain(String[]args){
Computerc=newComputer();
Threadt1=newThread(newproducer(c));
Threadt2=newThread(newConsumer(c));
t1.start();
t2.start();
try{
Thread.sleep(1500);
}catch(InterruptedExceptione){
//TODOAuto-generatedcatchblock
e.printStackTrace();
}
t1.stop();
t2.stop();
System.out.println(c.stack);
}
}
运行结果:
制造一台电脑
运走一台电脑
制造一台电脑
运走一台电脑
制造一台电脑
运走一台电脑
制造一台电脑
运走一台电脑
制造一台电脑
运走一台电脑
制造一台电脑
运走一台电脑
制造一台电脑
运走一台电脑
制造一台电脑
运走一台电脑
制造一台电脑
运走一台电脑
制造一台电脑
运走一台电脑
制造一台电脑
运走一台电脑
制造一台电脑
运走一台电脑
制造一台电脑
运走一台电脑
制造一台电脑
运走一台电脑
制造一台电脑
14
java怎么创建一个线程
Java线程类也是一个object类,它的实例都继承自java.lang.Thread或其子类。可以用如下方式用java中创建一个线程:
Treadthread=newThread();
执行该线程可以调用该线程的start()方法:
thread.start();
编写线程运行时执行的代码有两种方式:一种是创建Thread子类的一个实例并重写run方法,第二种是创建类的时候实现Runnable接口。接下来我们会具体讲解这两种方法:
创建Thread的子类
创建Thread子类的一个实例并重写run方法,run方法会在调用start()方法之后被执行。例子如下:
publicclassMyThreadextendsThread{
publicvoidrun(){
System.out.println("MyThreadrunning");
}
}
可以用如下方式创建并运行上述Thread子类
MyThreadmyThread=newMyThread();
myTread.start();
一旦线程启动后start方法就会立即返回,而不会等待到run方法执行完毕才返回。就好像run方法是在另外一个cpu上执行一样。当run方法执行后,将会打印出字符串MyThread running。
实现Runnable接口
第二种编写线程执行代码的方式是新建一个实现了java.lang.Runnable接口的类的实例,实例中的方法可以被线程调用。下面给出例子:
publicclassMyRunnableimplementsRunnable{
publicvoidrun(){
System.out.println("MyRunnablerunning");
}
}
为了使线程能够执行run()方法,需要在Thread类的构造函数中传入MyRunnable的实例对象。示例如下:
Threadthread=newThread(newMyRunnable());
thread.start();
当线程运行时,它将会调用实现了Runnable接口的run方法。上例中将会打印出”MyRunnable running”。
关于本次java new一个线程需哟注意什么和java怎么创建一个线程的问题分享到这里就结束了,如果解决了您的问题,我们非常高兴。