方法一: 用继承Thread实现
实例:
代码
package threadtest13;
//多线程的写法2,用两种情况变换,
//情况1:新建一个对象,两个线程共享一个对象。另外是新建两个对象,两个线程用两个对象
//情况2:int i=0;拿到run()外面与在run()里面两种情况。
//上面4种情况可以排列组合试一下
publicclass Thread13 {
publicstaticvoid main(String args[]){
MyThread myThread =new MyThread();
// MyThread myThread2= new MyThread();//2
Thread t1=new Thread(myThread);
Thread t2=new Thread(myThread);
//Thread t2= new Thread(myThread2); //2
t1.start();
t2.start();
}
}
class MyThread extends Thread {
// int i=0;//1
publicvoid run() {
String name = Thread.currentThread().getName();
String inf=Thread.currentThread().toString();
long idnum = Thread.currentThread().getId();
for(int i=0;i<10;i++){//不管是新建一个对象,还是两个对象,//2,都是打印20个数据
// for(;i<10;i++){//新建一个对象的时候,打印11个左右的数据 ,新建两个对象的时候,//2,会打印20个数据。//1
System.out.println("i----------"+i +",thread name=="+ name
+",threadid=="+ idnum+",thread inf=="+inf);
}
}
}
实例:
package com.thread.test;
publicclass ThreadTest extends Thread {
public ThreadTest(String str){//用构造函数控制线程的名字,如果不写,默认是thread-整数
super(str);
}
@Override
publicvoid run() {
synchronized(this){
for(int i=0;i<10;i++){//控制run的内部这些东西执行的次数,不加这句,run只执行一次。
System.out.println(i+getName());
try {
sleep((long)(Math.random()*1000));
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
//for循环结束
System.out.println("for循环结束"+getName());
}
super.run();
}
/*
* 此方法可添加也可以不填加,start都能够调用。
* @Override
public synchronized void start() {
// TODO Auto-generated method stub
super.start();
}*/
publicstaticvoid main(String args[]){
new ThreadTest("su").start();
new ThreadTest("zhu").start();
}
}
上面方法两个线程不能同步。
方法二:用“实现”Runnable方法实现
实例:
代码
package threadtest12;
//多线程的写法1
publicclass Thread12 {
publicstaticvoid main(String args[]) {
MyThread myThread =new MyThread();
//myThread.run();
//把这个MyThread包装称为Thread
Thread t1 =new Thread(myThread);
Thread t2=new Thread(myThread);
t1.start();
t2.start();
}
}
class MyThread implements Runnable {
@Override
publicvoid run() {
// TODO Auto-generated method stub
String name = Thread.currentThread().getName();
String inf=Thread.currentThread().toString();
long idnum = Thread.currentThread().getId();
for(int i=0;i<10;i++){
System.out.println("aaaaa----------"+",thread name=="+ name
+",threadid=="+ idnum+",thread inf=="+inf);
}
}
}
两个共享一个thread对象,并发调用,20条数据
实例:
/*
*
*
* 这段代码用实现接口来做
* 可以让类extends继承其他类*/
package com.thread.test1;
publicclass ThreadTest1 implements Runnable{
String threadName;
public ThreadTest1(String str){
threadName=str;
}
@Override
publicvoid run() {
// TODO Auto-generated method stub
for(int i =0;i<10;i++){
System.out.println("执行第"+i);
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//System.out.println("执行完第"+i);
}
System.out.println("结束");
}
publicstaticvoid main(String[] args){
/*
* 这段跟下面的作用是一样的。。。new的ThreadTest1的对象不能调用start方法
* ThreadTest1 threadTest1=new ThreadTest1("h");
Thread thread1=new Thread(threadTest1);
thread1.start();*/
new Thread(new ThreadTest1("su")).start();
}
}