Java 多线程的学习

在我们进行数据处理的时候,单一的线程处理数据比较慢,我们希望使用同样的代码来处理一件事,加快处理的速度,这时候需要使用java的多线程来处理数据!~

在java中,我们可以使用继承Thread类或者是实现Runnable接口来实现多线程!~

  1. 使用继承来实现:

package ynu.sanwen.cangzhang.thread;
//多线程的演示,不容易实现资源的共享,这个是主要是是用来做不是资源共享的实现
public class TestThread extends Thread{
private int tempNumber=9;
/**
* @param args
*/
private String name;
public TestThread(){

}

public TestThread(String name){
this.name=name;
}

public void run(){
for(int i=0;i System.out.println(name+"运行"+i);
}
}

public static void main(String[] args) {
TestThread t1=new TestThread("A");
TestThread t2=new TestThread("B");
//t1.run();
//t2.run(); //这样是顺序进行

t1.start();
t2.start(); //这样的话是非顺序进行,执行的顺序主要是根据操作系统来决定
}

}

 2.使用接口来实现

package ynu.sanwen.cangzhang.thread;
//如果我们的多线程是不要实现资源的共享的,我们就需要使用runnable这种方式
public class TestRunable implements Runnable{

/**
* @param args
*/
private String name;
public TestRunable(){

}

public TestRunable(String name){
this.name=name;
}

@Override
public void run() {
for(int i=0;i<7;i++){
System.out.println(name+"输出的结果是:"+i);
}
}

public static void main(String[] args) {
TestRunable r1=new TestRunable();
TestRunable r2=new TestRunable();
Thread t1=new Thread(r1);
Thread t2=new Thread(r2);

t1.start();
t2.start();
}

}

他们的区别主要是使用接口我们能更好的共享数据!~,现在就是做一个接口共享数据的范例,首先是申明一个私有变量,这个表示表的数量,在实现接口的时候,我们需要同时实现run方法,在run方法里面我们要做的就是不断循环,是的票的数量不断减少!

package ynu.sanwen.cangzhang.thread;
import java.util.Calendar;

public class SellTicket implements Runnable{
private int tikectNumber=700;
private static int forNumber=700;
private long endTime=Calendar.getInstance().getTimeInMillis();//初始化时间,用来记录开始时间

@Override
public void run() {
for(int i=0;i

/*线程同步的开始。。。。。。。。。。。。也就是这里面的代码只能是一个线程同时在执行----begin*/
synchronized(this){
if(tikectNumber>0){
System.out.println("此时的票数是:"+tikectNumber);
tikectNumber--;
}else{
System.out.println("线程执行的时间是"+(Calendar.getInstance().getTimeInMillis()-endTime));
break;
}
}

/*线程同步的开始。。。。。。。。。。。。也就是这里面的代码只能是一个线程同时在执行----end*/
/*线程休眠,相当于卖票的处理时间。。。。。。。。。。。。。*/
try {
System.out.println(Thread.currentThread().getName()+"卖出之后,剩余票是"+this.tikectNumber);
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}

public static void main(String[] args) {
//循环产生多个线程来解决问题
int windowsNumber=100; /*设置你要执行的线程的个数*/
SellTicket s=new SellTicket();
for(int i=1;i Thread t=new Thread(s,"窗口"+i);
t.start();
}
}
}

通过看到代码我们知道,我们可以使用synchronized来控制代码同步,就是说在这里执行的代码是有按顺序来执行,避免多个线程同时执行这个代码。

现在我们能控制多个线程多一个数的操作,但是在很多时候我们要做的是多一个数据集合进行操作,比如List,这时候按照上面的做法我们也是需要将获取List的过程放在synchronized代码里面

package ynu.sanwen.cangzhang.thread;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.List;

//处理数组里面的数据
public class ThreadWithList implements Runnable {
List list = new ArrayList();
int listNumber = 1000;
int beginListNumber=0;

long beginTime=Calendar.getInstance().getTimeInMillis();

public void run() {
synchronized (this) {
for (int i = 0; i < listNumber; i++) {
list.add("里面的东西是" + i);
}
}

for (int j = 0; j < 1000; j++) {
String tempStr="";
synchronized (this) {
//由于里面的数据是同步,保障了数据里面的数据只是能被获取到一次
if (beginListNumber == listNumber) {
System.out.println(Thread.currentThread().getName()+"执行的时间是"+(Calendar.getInstance().getTimeInMillis()-beginTime));
break;
}
tempStr=list.get(beginListNumber);
beginListNumber++;
}
//将数据交给处理程序去处理。。。。。。。。。。
this.doSomething(tempStr);
}
}

//用来表示正在处理数据。。。。。。。。。
public void doSomething(String strTemp){
System.out.println("正在处理的字符是"+strTemp);

try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}

public static void main(String[] args) {
ThreadWithList s = new ThreadWithList();
for (int i = 0; i < 1000; i++) {
Thread t = new Thread(s, "线程" + i);
t.start();
}
}
}

共有 23 条评论

Top