1.实现一个Runnable。在run内部打印一个消息,然后调用yield()。重复这个操作三次
然后从run中返回。在构造器中放置一条启动消息,并且放置一条在任务终止时的关闭
消息,使用线程创建大量的这种任务并驱动他们。
public class Project_one implements Runnable{
private String name; //任务名
public Project_one(String name) {
this.name = name;
System.out.println(this.name+"正在启动");
}
@Override
public void run() {
for(int i=0;i<3;i++) {
System.out.println(this.name+"运行中——————");
Thread.yield();
}
System.out.println(this.name+"运行成功");
}
public static void main(String[] args) {
new Thread(new Project_one("一号")).start();
new Thread(new Project_one("二号")).start();
new Thread(new Project_one("三号")).start();
}
}
2.遵循generic/Fibonacci.java的形式,创建一个任务,它可以产生由n个斐波那契数字组成的序列,
其中n是通过任务的构造器而提供的。使用大量线程创建这种任务并驱动他们。
public class Project_one implements Runnable{
private String name; //任务名
private int n;
@SuppressWarnings("unused")
private int[] s;
public Project_one(String name,int n) {
this.name = name;
this.n = n;
System.out.println(this.name+"正在启动");
}
@Override
public void run() {
s = new int[n];
s[0] = 1;
s[1] = 1;
for(int i=2;i<this.n;i++) {
s[i]=s[i-1]+s[i-2];
Thread.yield();
}
System.out.println(this.name+"运行成功");
print();
}
public void print() {
System.out.println(this.name+":");
for(int i=0;i<this.n;i++) {
System.out.print(s[i]+" ");
}
System.out.println();
}
public static void main(String[] args) {
new Thread(new Project_one("一号",5)).start();
new Thread(new Project_one("二号",6)).start();
new Thread(new Project_one("三号",7)).start();
}
}
3.启动3个线程打印递增的数字, 线程1先打印1,2,3,4,5, 然后是线程2打印6,7,8,9,10, 然后是线程3打印11,12,13,14,15.
接着再由线程1打印16,17,18,19,20….以此类推, 直到打印到75。
public class Main {
public static void main(String[] args)
{
Object ob = new Object();
new Thread(new Ran(1,"一号",ob)).start();
new Thread(new Ran(2,"二号",ob)).start();
new Thread(new Ran(3,"三号",ob)).start();
}
}
class Ran implements Runnable{
Object ob; //锁
int id; //线程id
String name; //线程名
static int count=0;
public Ran(int id,String name,Object ob) {
this.id = id;
this.name = name;
this.ob = ob;
}
@Override
public void run() {
while(count<75) { //循环到75
synchronized(ob) {
if(count/5%3+1==id) { //如果等于线程id就进来打印
System.out.println(this.name);
for(int i=0;i<5;i++) {
count++;
System.out.print(count+" ");
}
System.out.println();
ob.notifyAll(); //打印完成唤醒其他线程
}
else { //否则就等待
try {
ob.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
}
}
4.现有的程序代码模拟产生了16个日志对象,并且需要运行16秒才能打印完这些日志,
请在程序中增加4个线程去调用parseLog()方法来分头打印这16个日志对象,程序只需要运行4秒即可打印完这些日志对象。
public class Main {
public static void main(String[] args){
System.out.println("begin:"+(System.currentTimeMillis()/1000));
/*模拟处理16行日志,下面的代码产生了16个日志对象,当前代码需要运行16秒才能打印完这些日志。
修改程序代码,开四个线程让这16个对象在4秒钟打完。
*/
//定义一个任务队列,使得消息从一端进去,一端处理
final BlockingQueue<String> queue=new ArrayBlockingQueue<String>(16); //里面自带锁
for(int i=0;i<16;i++){ //这行代码不能改动
final String log = ""+(i+1);//这行代码不能改动
{
try {
queue.put(log); //将消息存进去
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
for(int i=0;i<4;i++) {
new Thread() {
public void run(){
while(true) {
try {
Main.parseLog(queue.take());
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}.start();
}
}
//parseLog方法内部的代码不能改动
public static void parseLog(String log){
System.out.println(log+":"+(System.currentTimeMillis()/1000));
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
后续还有更新!