//创建线程方式一:继承Thread的类,重写run()方法,调用start方法开启线程
//总结:线程开启线程不一定立即执行,由cpu调度执行
public class Thread_sttudy extends Thread
{
@Override
public void run() {
//run方法线程体
for(int i=0;i<20;i++)
{
System.out.println("我在看代码--"+i);
}
}
public static void main(String[] args)
{ //main线程,主线程
//创建一个线程对象
Thread_sttudy Thread1=new Thread_sttudy();
//调用start()方法开启线程
Thread1.start();
for(int i=0;i<20;i++)
{
System.out.println("我在看网课---"+i);
}
}
}1.2 为什么创建线程要调用start方法而不是run方法?
//调用start()方法开启线程
Thread1.start();
/*
(1)
public synchronized void start() {
start0();
}
(2)
start0()是本地方法,是JVM调用,底层是c/c++实现的
真正实现多线程的效果,是start0(),而不是run
private native void start0();
package top.ltyzqhh.thread.study;
import org.apache.commons.io.FileUtils;
import java.io.File;
import java.io.IOException;
import java.net.URL;
//练习Thread,实现多线程同步下载图片
public class PhotoDowload extends Thread{
private String url;//网络图片地址
private String name;//保存的文件名
public PhotoDowload(String url,String name){
this.url=url;
this.name=name;
}
public void run() {
WebDowload webDowload = new WebDowload();
webDowload.download(url,name);
System.out.println("下载了文件名为"+name);
}
public static void main(String[] args) {
PhotoDowload Thread1=new PhotoDowload("<https://i0.hdslb.com/bfs/feed-admin/377590bd3a7c97a4d20511327cf51e2ce40f47f7.jpg@880w_388h_1c_95q","1.jpg>");
PhotoDowload Thread2=new PhotoDowload("<https://i0.hdslb.com/bfs/feed-admin/377590bd3a7c97a4d20511327cf51e2ce40f47f7.jpg@880w_388h_1c_95q","2.jpg>");
PhotoDowload Thread3=new PhotoDowload("<https://i0.hdslb.com/bfs/feed-admin/377590bd3a7c97a4d20511327cf51e2ce40f47f7.jpg@880w_388h_1c_95q","3.jpg>");
Thread1.start();
Thread2.start();
Thread3.start();
}
}
//下载器
class WebDowload {
//下载方法
public void download(String url,String name){
try {
FileUtils.copyURLToFile(new URL(url),new File(name));
} catch (IOException e) {
e.printStackTrace();
System.out.println("IO异常,download方法出现问题");
}
}
}
需要导入以下包
使用背景
package top.ltyzqhh.thread.study;
public class Thread_runnable implements Runnable{
public void run() {
//run方法线程体
for(int i=0;i<20;i++)
{
System.out.println("我在看代码--"+i);
}
}
public static void main(String[] args)
{ //main线程,主线程
//创建一个Runnable接口的实现对象类
Thread_runnable t1 =new Thread_runnable();
//创建线程对象,通过线程对象来开启我们的线程,代理
/* Thread thread =new Thread(t1);
//调用start()方法开启线程
thread.start();
*/
new Thread(t1).start();
for(int i=0;i<20;i++)
{
System.out.println("我在看网课---"+i);
}
}
}
思考:在实现Runnable接口实现多线程的方式中, Thread thread =new Thread(t1);
相当于这个图中的商店,而实现了runnable这个接口的类则是相当于顾客,Thread类当中的的start()
方法则相当于渠道。 而这个产品就相当于创建线程