1. 两个线程轮流打印数字,一直到100
package XianChengZuoye;
public class ZuoYe1 extends Thread{
static int num=0;
static Object obj=new Object();
@Override
public void run() {
while (true){
try {
Thread.sleep(2000);
synchronized (obj) {
if (num >= 0) {
System.out.println("打印数字:" +Thread.currentThread()+ num);
num++;
}else {
System.out.println("0-100的数字已打印完");
System.exit(0);
}
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
public static void main(String[] args) {
ZuoYe1 z1 = new ZuoYe1();
z1.start();
ZuoYe1 z2 = new ZuoYe1();
z2.start();
}
}
2. 三个窗口同时卖票 用 实现Runnable方式
package Xianchengti;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.FutureTask;
public class HuoChePiao extends Thread {
static int count=20;
static Object obj=new Object();
@Override
public void run() {
while (true){
try {
Thread.sleep(2000);
synchronized (obj){
if (count>0){
System.out.println("当前被卖出的是:"+Thread.currentThread()+count+"号票");
count--;
}else {
System.out.println("当前票已卖完");
System.exit(0);
}
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
public static void main(String[] args) {
HuoChePiao hc = new HuoChePiao();
hc.start();
HuoChePiao hc1 = new HuoChePiao();
hc1.start();
HuoChePiao hc2 = new HuoChePiao();
hc2.start();
}
}
3. 多线程下载 ,实现断点续传
package XiaZaiXianCheng;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.RandomAccessFile;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection;
public class XiaZai extends Thread {
private int startIndex; //线程开始下载的位置
private int endIndex; //线程结束下载的位置
private int threadId; //线程编号
public XiaZai(int startIndex, int endIndex, int threadId) {
this.startIndex = startIndex;
this.endIndex = endIndex;
this.threadId = threadId;
}
@Override
public void run() {
try {
URL url = new URL(XiaZaiTest.path);
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setRequestMethod("GET");//get请求
conn.setConnectTimeout(5000); //链接超时
conn.setReadTimeout(5000);//读取超时
conn.setRequestProperty("Range","bytes="+startIndex+"-"+endIndex);// 设置返回请求参数 获取线程下载范围
if(conn.getResponseCode()==206){
InputStream is = conn.getInputStream();//存储的是服务器上面 百度客户端数据
//提供一个接收地方(本地接收)
File file = new File("BaiduNetdisk_6.9.7.4.exe");
//输出流 ,开始写数据 ,随机读写 流
RandomAccessFile raf = new RandomAccessFile(file,"rwd");
raf.seek(startIndex); //跳转到 每个线程 开始读取的位置
System.out.println("线程:"+threadId+" 开始的位置:"+startIndex+"---"+" 结束位置"+endIndex);
int len=0;
byte[] bt = new byte[1024];
while ((len=is.read(bt))!=-1){
raf.write(bt,0,len);
}
System.out.println("线程:"+threadId+"下载完毕...");
raf.close();
raf.close();
XiaZaiTest.finishedThread++;
//如果所有线程都下载完毕 ,让finishedThread 为0
synchronized (XiaZaiTest.path){
XiaZaiTest.finishedThread=0;
}
}
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
测试类:
package XiaZaiXianCheng;
import java.io.IOException;
import java.net.HttpURLConnection;
import java.net.URL;
public class XiaZaiTest {
//这是一个下载的安装包地址 1.5MB大小
static String path="http://softforspeed.51xiazai.cn/down/BaiduNetdisk_6.9.7.4.exe";
static int threadCount = 3; //3个线程
static int finishedThread=0;//和 线程数 有关 ,记录每一个线程是否执行完毕
public static void main(String[] args) throws IOException {
//统一资源管理器 ,可以直接打开 网络地址
URL url = new URL(XiaZaiTest.path);
//因为基于http请求 , 获取HttpURLConnection , 获取网络链接对象 ,就可以和服务器建立链接
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
//设置一些参数
conn.setRequestMethod("GET"); //get请求
conn.setConnectTimeout(5000); //链接超时
conn.setReadTimeout(5000); //读取超时
if(conn.getResponseCode()==200){
//1. 拿到 文件总长 (总大小)
int contentLength = conn.getContentLength();
//2. 每个线程下载的大小
int size = contentLength/threadCount;
//3.开启线程执行下载
for (int i = 0; i < threadCount; i++) {
int startIndex = i*size; // (i从0开始 )
int endIndex = (i+1)*size; //结束位置
XiaZai thread = new XiaZai(startIndex,endIndex,i);
thread.start();
}
}
}
}
简单线程继承
package Xianchengti;
public class Threaddemo1 extends Thread{
@Override
public void run() {
System.out.println("继承线程extends~~~~~");
}
public static void main(String[] args) {
Threaddemo1 td1 = new Threaddemo1();
td1.start();
Threaddemo1 td2 = new Threaddemo1();
td2.start();
}
}
实现Runable接口的线程
package Xianchengti;
//实现接口
public class Threaddemo2 implements Runnable{
@Override
public void run() {
System.out.println("实现Runable接口的线程~~~~~");
}
public static void main(String[] args) {
Threaddemo2 td1 = new Threaddemo2();
Thread th1 = new Thread(td1);
th1.start();
Threaddemo2 td2 = new Threaddemo2();
Thread th2 = new Thread(td1);
th2.start();
}
}