程序、进程与线程
进程的特点:动态性、并发性、独立性
并发和并行的区别
并发:多个CPU同时执行多个任务
并行:一个CPU(采用时间片)同时执行多个任务
注:很多多线程是模拟出来的,真正的多线程是指有多个cpu,即多核,如服务器。如果是模拟出来的多线程,即在一个cpu的情况下,在同一个时间点,cpu只能执行一个代码,因为线程之间切换很快,所以就有同时执行的错觉。
线程的创建和启动
线程的创建
• 方式1:继承Java.lang.Thread类,并覆盖run() 方法
• 方式2:实现Java.lang.Runnable接口,并实现run() 方法
• 方式3:实现callable接口注:run( )称为线程体
创建线程方式一:
* 1. 创建:继承Thread+重写run
* 2. 启动:创建子类对象+start()方法(不保证立即运行 由cpu去调用)
/**
* 创建线程方式一:
* 1. 创建:继承Thread+重写run
* 2. 启动:创建子类对象+start()方法
* @author Administrator
*
*/
public class StartThread extends Thread{
//线程入口点
public void run() {
super.run();
for(int i=0;i<20;i++) {
System.out.println("一边听歌");
}
}
public static void main(String[] args) {
//创建子类对象
StartThread st=new StartThread();
//启动线程
st.start();
// st.run(); //普通方法的调用
for(int i=0;i<20;i++) {
System.out.println("一边coding");
}
}
}
WebDownloader.java
/**
* 下载图片
* @author Administrator
*
*/
import java.io.File;
import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URL;
import org.apache.commons.io.FileUtils;
public class WebDownloader {
/**
* 下载
* @param url
* @param name
*/
public void download(String url,String name) {
try {
FileUtils.copyURLToFile(new URL(url), new File(name));
} catch (MalformedURLException e) {
e.printStackTrace();
System.out.println("不合法的url");
} catch (IOException e) {
e.printStackTrace();
System.out.println("下载失败");
}
}
}
TDownloader.java
public class TDownloader extends Thread {
private String url; //远程路径
private String name; // 存储名字
public TDownloader(String url, String name) {
super();
this.url = url;
this.name = name;
}
@Override
public void run() {
super.run();
WebDownloader wd= new WebDownloader();
wd.download(url, name);
System.out.println(name);
}
public static void main(String[] args) {
TDownloader td1=new TDownloader("http://img4.3lian.com/sucai/img3/399/01+.jpg", "1.jpg");
TDownloader td2=new TDownloader("http://img4.3lian.com/sucai/img3/399/10+.jpg", "2.jpg");
TDownloader td3=new TDownloader("http://img4.3lian.com/sucai/img3/399/15+.jpg", "3.jpg");
//启动三个线程
td1.start();
td2.start();
td3.start();
}
}
注:必须在工程目录下,导入此文件
创建线程方式二:
* 1. 创建:实现Runnable+重写run
* 2. 启动:创建实现类对象+Thread对象+start()方法推荐使用Runnable接口:避免单继承的局限性,优先使用接口
* 优点:方便共享资源
/**
* 创建线程方式二:
* 1. 创建:实现Runnable+重写run
* 2. 启动:创建实现类对象+Thread对象+start()方法
* @author Administrator
*
*/
public class StartRun implements Runnable{
//线程入口点
public void run() {
for(int i=0;i<20;i++) {
System.out.println("一边听歌");
}
}
public static void main(String[] args) {
// //创建实现类对象
// StartRun sr=new StartRun();
// //创建代理类对象
// Thread t=new Thread(sr);
// //启动
// t.start();
new Thread(new StartRun()).start();
for(int i=0;i<20;i++) {
System.out.println("一边coding");
}
}
}
采用Runnable接口,对TDownloader.java 进行修改为IDownloader.java 实现上面的效果
public class IDownloader implements Runnable{
private String url; //远程路径
private String name; // 存储名字
public IDownloader(String url, String name) {
super();
this.url = url;
this.name = name;
}
@Override
public void run() {
WebDownloader wd= new WebDownloader();
wd.download(url, name);
System.out.println(name);
}
public static void main(String[] args) {
IDownloader td1=new IDownloader("http://img4.3lian.com/sucai/img3/399/01+.jpg", "1.jpg");
IDownloader td2=new IDownloader("http://img4.3lian.com/sucai/img3/399/10+.jpg", "2.jpg");
IDownloader td3=new IDownloader("http://img4.3lian.com/sucai/img3/399/15+.jpg", "3.jpg");
//启动三个线程
new Thread(td1).start();
new Thread(td2).start();
new Thread(td3).start();
}
}